【发布时间】:2018-03-05 23:22:38
【问题描述】:
我有两个月的镶木地板文件 2017_01.parquet 和 2017_08.parquet,这些架构是:
2017_01.parquet:
root
|-- value: struct (nullable = true)
| |-- version: struct (nullable = true)
| | |-- major: integer (nullable = true)
| | |-- minor: integer (nullable = true)
| |-- guid: string (nullable = true)
2017_08.parquet:
root
|-- value: struct (nullable = true)
| |-- version: struct (nullable = true)
| | |-- major: integer (nullable = true)
| | |-- minor: integer (nullable = true)
| | |-- vnum: integer (nullable = true)
| |-- guid: string (nullable = true)
还有我的代码
SQL = """
SELECT value.version.major,
value.version.minor,
value.version.vnum
FROM OUT_TABLE
LIMIT 10"""
parquetFile = spark.read.parquet("/mydata/2017_08.parquet")
parquetFile.createOrReplaceTempView("OUT_TABLE")
out_osce = spark.sql(SQL)
out_osce.show()
当我加载 2017_08.parquet show 时:
+-----+-----+----+
|major|minor|vnum|
+-----+-----+----+
| 0001| 4610|1315|
| 0002| 4610|6206|
| 0003| 4610|6125|
但如果我加载 2017_01.parquet 之类的
parquetFile = spark.read.parquet("/mydata/2017_01.parquet")
SQL 显示错误:
pyspark.sql.utils.AnalysisException: u'No such struct field vnum in major, minor; line 4 pos 11'
我知道原因是2017_01.parquet没有vnum列,我有两个slove解决方案,一个是使用mergeSchema另一个是在读取parquet文件时使用schema,但是这些方式也有很大的问题。
第一个解决方案需要读取2017_08.parquet,如果我不需要08的数据就会有问题,如果运气不好vnum是一个选项列而08没有这个列仍然会出错
第二种解决方案是读取时给出schema,如spark.read.schema(schema).parquet("/mydata/2017_01.parquet"),这种方式需要先写入schema,但如果文件是一个非常复杂的嵌套表,用户可能无法写入schema,并且schema会更新。
我想问任何人有第三种解决方案,然后只阅读 2017_01.parquet 并输出如下:
+-----+-----+----+
|major|minor|vnum|
+-----+-----+----+
| 0001| 4600|null|
| 0002| 4600|null|
| 0003| 4600|null|
【问题讨论】:
-
感谢编辑建议@himanshuIIITian
标签: python apache-spark pyspark apache-spark-sql parquet