spark:将csv文件读取为DataFrame

以下内容在spark2.2和spark2.3中测试都通过

通用转换形式:

spark.read.schema(sch).option("header", true).csv("/path/file.csv")

注意以下几点:

  • csv会完全按照指定的schema结构进行转换,若不指定schema默认都解析为StringType(若指定了option("inferSchema", true)会遍历数据推断类型)。

  • 列的顺序和指定schema中列的顺序是一致的,这点不像json,json会进行列名对应,但是csv不会,只会根据顺序判断(即使指定了option("header", true)也无效,会将header中列名进行覆盖)。

  • 若schema列数多于原始数据列数,schema最后面多出的列会为null。

  • 若schema列数少于原始数据列数,只会取原始数据中前面的列,原始数据多出的列的数据将被忽略。

看下面的例子:

import org.apache.spark.sql.types._
val sch = StructType(
StructField("col1", LongType)::
StructField("age", StringType)::
Nil
)

val s1 = "\"id\""
val s2 = "\"1\""
val ds = spark.createDataset(Seq(s1, s2))
ds.show(false)
+-----+
|value|
+-----+
|"id" |
|"1"  |
+-----+

val df = spark.read.schema(sch).option("header", true).csv(ds)
df.show(false)
+----+----+
|col1|age |
+----+----+
|1   |null|
+----+----+

val s1 = "\"id\",\"name\",\"age\",\"text\""
val s2 = "\"1\",\"张三\",\"23\",\"你好\""
val ds = spark.createDataset(Seq(s1, s2))
ds.show(false)
+------------------------+
|value                   |
+------------------------+
|"id","name","age","text"|
|"1","张三","23","你好"   |
+------------------------+

val df = spark.read.schema(sch).option("header", true).csv(ds)
df.show(false)
+----+---+
|col1|age|
+----+---+
|1   |张三|
+----+---+

你可能感兴趣的:(大数据,编程语言/Scala,大数据/spark)