pyspark - 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)
解决方案
如果有人感兴趣,我会遇到同样的错误,问题是我正在阅读的文件之一不符合架构。不匹配是由不同顺序的列引起的。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
推荐阅读
- sql - 删除版本 3.22.0 的 SQLite 中除一个重复行之外的所有重复行?
- javascript - 反应 - 我的
- javascript - 不允许从 React 对 Django API 的请求
- ios - SwiftUI iOS 13 ZStack 的行为与 iOS 14 不同
- c++ - 无法将字符串转换为小写
- ios - Swift UIView 绘制对角线一侧和圆角
- sql-server - 如何使触发器仅在插入的最近记录上起作用?
- docker - 如何在 asp.net 核心中使用 url 公开多容器 dockers 应用程序
- pip - ModuleNotFoundError:没有以诗歌安装命名的模块
- java - 如何将数字转换为文本