我在Spark 2.2
集群中使用hadoop 2.6.3
。
我要处理数百个CSV文件,每个文件包含10到60列。
对于每个CSV文件,该模式都存储在一个JSON文件中,我可以读取该文件并将其转换为spark.sql.types.StructField
对象。
我的文件不干净,几乎每一行都有至少一个空值。
示例: 因此,当我加载没有模式的csv文件时:
df = spark.read.option("header","false").option("delimiter",del).csv(filename)
我明白了:
| _c01| _c02| _c03|_c04|
+----------+---------+-------+----+
| 1| 1234| test|null|
| 2| null| test| 10|
| 3| 1256| test| 9|
| 4| null| null| 8|
因此,当我使用架构加载csv文件
schema = createSparkSchemaFromJsonSchema(json_filename)
df = spark.read.option("header","false").option("delimiter",del).csv(filename, schema = schema)
df.printSchema
df.show()
我到处都是空的
root
|-- student_id: integer(nullable = false)
|-- school_id: integer(nullable = false)
|-- teacher: string (nullable = false)
|-- rank: integer(nullable = false)
|student_id|school_id|teacher|rank|
+----------+---------+-------+----+
| null| null| null|null|
| null| null| null|null|
| null| null| null|null|
| null| null| null|null|
我尝试了option("nullValue", "null")
之类的几个选项,但没有用
我知道对每列执行类似df.select(col("colname").cast(IntegerType))
的操作应该可以,但是我想保持我的代码通用(数百个文件),而不是对每一列进行处理。
有人对此有一些想法吗?