【问题标题】:PySpark Error: " An error occurred while calling o31.parseDataType"PySpark 错误:“调用 o31.parseDataType 时发生错误”
【发布时间】:2019-08-15 21:35:08
【问题描述】:

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

【问题讨论】:

    标签: pyspark pyspark-sql


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      Anne,我看到您使用了 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
      )
      

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

      【讨论】:

        【解决方案3】:

        问题解决了

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2017-01-20
          • 1970-01-01
          • 2019-06-29
          • 2022-01-13
          • 2021-11-14
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多