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

时间:2017-12-20 11:55:51

标签: apache-spark parquet

我有一个镶木地板文件,由spark作为外部表读取。

其中一列在镶木地板图案和火花表中都被定义为int。

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

然而,当我尝试通过spark作为外部表(使用bigint)读取旧的镶木地板文件(使用int)时,我收到以下错误:

  

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

一个可能的解决方案是将旧木地板中的列类型改为long,我在这里问过:How can I change parquet column type from int to long?,但由于我有大量数据,因此非常昂贵。

另一种可能的解决方案是根据模式将每个镶木地板文件读取到不同的火花表,并创建旧表和新表的联合视图,这非常难看。

还有另一种方法可以从镶木地板中读取一个整列的火花吗?

1 个答案:

答案 0 :(得分:0)

使用pyspark不能只是做

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

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

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

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