apache-spark - 如何修复非法 Parquet 类型 : INT64 (TIMESTAMP_MICROS) error

标签 apache-spark pyspark apache-spark-sql parquet

我每天使用 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/

相关文章:

apache-spark - Spark Streaming 中的有序处理

apache-spark - 通过Thrift服务器访问Spark SQL RDD表

python - 从 pyspark 中的数据框构建 StructType

apache-spark - PySpark-获取组中每一行的行号

java - 将 scala Flatten 转换为在 Spark 中的 Java 中使用

python - 如何使用 pyspark collect_list 函数检索所有列

python - Pyspark 中的向量汇编器正在创建多个向量的元组而不是单个向量,如何解决这个问题?

python - 在 PySpark 中使用 'window' 函数按天分组时出现问题

python - Py4JException : Constructor org. apache.spark.sql.SparkSession([class org.apache.spark.SparkContext, class java.util.HashMap]) 不存在

java - 有没有办法过滤包含特定模式的RDD