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 上运行计算之后?