我正在尝试使用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)
答案 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
)
答案中,您只是删除了无法解决错误的架构。