首页 > 解决方案 > PySpark 错误:“调用 o31.parseDataType 时发生错误”

问题描述

我正在尝试使用 pySpark 加载 .gz 文件,但出现此错误。我的python代码是:

schema_daily = StructType([
    StructField("id", StringType(), True),
    StructField("date", DataType(), True),
    StructField("element", StringType(), True),
    StructField("value", DoubleType(), True),
    StructField("measurement flag", StringType(), True),
    StructField("quality flag", StringType(), True),
    StructField("source flag", StringType(), True),
    StructField("observation time", TimestampType(), True),
])
daily = (
    spark.read.format("com.databricks.spark.csv")
    .option("header", "false")
    .option("inferSchema", "false")
    .schema(schema_daily)
    .load("hdfs:///data/ghcnd/daily/1763.csv.gz")
)
daily.cache()
daily.show()

该文件存储为:

-rwxr-xr-x   8 hadoop supergroup  196551118 2019-03-17 21:26 /data/ghcnd/daily/2013.csv.gz
-rwxr-xr-x   8 hadoop supergroup  193121272 2019-03-17 21:26 /data/ghcnd/daily/2014.csv.gz
-rwxr-xr-x   8 hadoop supergroup  196007583 2019-03-17 21:26 /data/ghcnd/daily/2015.csv.gz
-rwxr-xr-x   8 hadoop supergroup  194390036 2019-03-17 21:27 /data/ghcnd/daily/2016.csv.gz
-rwxr-xr-x   8 hadoop supergroup  125257391 2019-03-17 21:27 /data/ghcnd/daily/2017.csv.gz

看起来它抱怨将 JSON 字符串转换为数据类型失败,不确定它是否与文件类型有关?

完整的错误:

Py4JJavaError: An error occurred while calling o31.parseDataType.
: java.lang.IllegalArgumentException: Failed to convert the JSON string 'data' to a data type.
        at org.apache.spark.sql.types.DataType$$anonfun$nameToType$1.apply(DataType.scala:142)
        at org.apache.spark.sql.types.DataType$$anonfun$nameToType$1.apply(DataType.scala:142)

标签: pysparkpyspark-sql

解决方案


如果有人感兴趣,我会遇到同样的错误,问题是我正在阅读的文件之一不符合架构。不匹配是由不同顺序的列引起的。pyspark 错误不是很有帮助,但是可以查看 spark 日志。我的是这样的:

19/08/19 19:40:49 WARN CSVDataSource: CSV header does not conform to the schema.
Header: col1, col2, col4, col3
Schema: col1, col2, col3, col4
Expected: col3 but found: col4

推荐阅读