PySpark错误:“调用o31.parseDataType时发生错误”

时间:2019-08-15 21:35:08

标签: pyspark pyspark-sql

我正在尝试使用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)

3 个答案:

答案 0 :(得分:0)

万一有兴趣的人,我也有同样的错误,问题是我正在读取的文件之一不符合架构。不匹配是由不同顺序的列引起的。 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

答案 1 :(得分:0)

问题已通过

解决
raw_daily = spark.read.format("csv").option("header", "true").load("hdfs:///data/ghcnd/daily/1800.csv.gz")

答案 2 :(得分:0)

安妮,我看到您已经使用Scala的方式读取架构。我确定还有其他开发人员会遇到相同的错误,这就是我决定回答这个问题的原因,尽管这是一个古老的问题。另一个问题是您的架构中有一个DateType(),但是在加载数据时却没有提供任何格式。

spark.read.format("com.databricks.spark.csv")
    .option("header", "false")
    .option("inferSchema", "false")
    .schema(schema_daily)  # This is not how you do it in Python. This is the Scala way
    .load("hdfs:///data/ghcnd/daily/1763.csv.gz")

这就是您应该这样做的方式:

spark.read.format("csv")
     .option("header", "true")
     .option("inferSchema", "false")
     .option('dateFormat', ' <the format of your date> ')  # this is missing in your read function. 
     .schema=schema_daily  # this line has been changed

另一种方法(或更好的方法):

spark.read.option('dateFormat', ' <the format of your date> ').csv(
    header=True,
    schema=schema_daily
)

答案中,您只是删除了无法解决错误的架构。