我每天使用 PySpark
中的 sqlContext.read.parquet
函数读取 parquet
文件。该数据有一个 timestamp
列。他们将时间戳字段从 2019-08-26T00:00:13.600+0000
更改为 2019-08-26T00:00:13.600Z
。它在 Databricks 中读取良好,但当我尝试通过 Spark 集群读取它时,它给出了 Illegal Parquet type: INT64 (TIMESTAMP_MICROS)
错误。如何使用 read.parquet
函数本身读取这个新列?
目前我使用: from_unixtime(unix_timestamp(ts,"yyyy-MM-dd HH:mm:ss.SSS"),"yyyy-MM-dd")
作为 ts 来转换 2019-08-26T00:00:13.600+0000
转换为 2019-08-26
格式。
如何将 2019-08-26T00:00:13.600Z
转换为 2019-08-26
?
最佳答案
这可能是由于您的数据被一个系统写入 Parquet ,而您正在尝试从另一个系统读取 Parquet 。这两个系统使用不同版本的 Parquet。
我也有类似的问题。就我而言,我在 Python 中准备了带有时间戳列的数据,并使用 pandas.to_parquet
保存它。后来我尝试在EMR上读取Pyspark中的parquet并得到错误:
org.apache.spark.sql.AnalysisException: Illegal Parquet type: INT64 (TIMESTAMP(NANOS,false))
经过一番搜索,发现这是由于 Pandas 和 Pyspark 可以处理的时间戳分辨率不同造成的。我的数据集有几个时间戳列。在 Pandas 中,时间戳以纳秒分辨率表示。但是,Pyspark 使用的某些 Parquet 读取器可能仅支持以毫秒(“ms”)或微秒(“us”)分辨率存储的时间戳。请参阅https://arrow.apache.org/docs/python/parquet.html#storing-timestamps进行额外讨论。
因此,当我使用时间戳列保存 Pandas 数据帧时,我显式地将时间戳列强制为微秒分辨率。我必须在 Python 中对每个分区进行强制转换。
关于apache-spark - 如何修复非法 Parquet 类型 : INT64 (TIMESTAMP_MICROS) error,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57699926/