Spark:从镶木地板中读取一个 int 列,只要

Posted

技术标签:

【中文标题】Spark:从镶木地板中读取一个 int 列,只要【英文标题】:Spark: read from parquet an int column as long 【发布时间】:2018-06-02 23:35:34 【问题描述】:

我有一个 parquet 文件,由 spark 作为外部表读取。

其中一列在 parquet 模式和 spark 表中都定义为 int。

最近,我发现 int 对于我的需要来说太小了,所以我在新的 parquet 文件中将列类型更改为 long。 我还将 spark 表中的类型更改为 bigint。

但是,当我尝试通过 spark 作为外部表(使用 bigint)读取旧 parquet 文件(使用 int)时,出现以下错误:

java.lang.UnsupportedOperationException: org.apache.parquet.column.values.dictionary.PlainValuesDictionary$PlainIntegerDictionary

一种可能的解决方案是将旧 parquet 中的列类型更改为 long,我在这里询问过:How can I change parquet column type from int to long?,但由于我有很多数据,它非常昂贵。

另一种可能的解决方案是将每个parquet文件根据其schema读取到不同的spark表中,并创建新旧表的union view,这很丑。

还有另一种方法可以从 parquet 中读取一个 int 列,只要在 spark 中?

【问题讨论】:

你找到解决办法了吗? 不...... 【参考方案1】:

你不能使用 pyspark 吗

df = spark.read.parquet('path to parquet files')

只需更改数据框中的列类型

new_df = (df
          .withColumn('col_name', col('col_name').cast(LongType()))
         )

然后使用覆盖模式将新的数据帧保存到相同的位置

【讨论】:

以上是关于Spark:从镶木地板中读取一个 int 列,只要的主要内容,如果未能解决你的问题,请参考以下文章

无法从镶木地板中读取零件文件

如何从镶木地板文件创建表格

从镶木地板表中选择在蜂巢中不返回任何内容

从镶木地板自动推断模式/有选择地将字符串转换为浮点数

如何从镶木地板文件中获取架构/列名?

什么时候在 Spark 中执行 .repartition(Int AnyValue),在读取 Parquet 之后(或)在 Parquet 上运行计算之后?