PySpark Dataframe指定架构时,每行返回null

时间:2019-11-01 13:49:34

标签: dataframe pyspark

我在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))的操作应该可以,但是我想保持我的代码通用(数百个文件),而不是对每一列进行处理。

有人对此有一些想法吗?

0 个答案:

没有答案