Scala 拼花地板数据类型问题
我有一堆拼花地板文件,我已经用Impala的CreateExternalTable创建了外部表格 但是当我发布Scala 拼花地板数据类型问题,scala,apache-spark,apache-spark-sql,parquet,Scala,Apache Spark,Apache Spark Sql,Parquet,我有一堆拼花地板文件,我已经用Impala的CreateExternalTable创建了外部表格 但是当我发布 select * from my_table 它回来了 错误:文件'hdfs://xyz..“”的列“xyz”具有不兼容的拼花地板架构。列类型:小数5,2,拼花模式:可选int32 final_apr[i:4 d:1 r:0] 所以我仔细观察了命令的输出 parquet-tools schema my_parquet 并观察到所有为INT64但不是固定字节数组的列都存在此问题 所以
select * from my_table
它回来了
错误:文件'hdfs://xyz..“”的列“xyz”具有不兼容的拼花地板架构。列类型:小数5,2,拼花模式:可选int32 final_apr[i:4 d:1 r:0]
所以我仔细观察了命令的输出
parquet-tools schema my_parquet
并观察到所有为INT64但不是固定字节数组的列都存在此问题
所以我手动执行了这个命令
ALTER TABLE schema.table_name CHANGE old-column new_column BIGINT;
要将默认创建的列类型更改为BIGINT per,则可以从我的_表中执行select*
我使用spark在scala中实现了上述功能,即我能够读取拼花文件并将其存储为impala表,还能够通过编程方式从我的_表查询中发出select*
然而,我试图从impala shell手动查询,我遇到了如上所示的相同错误
与手动更新列以更改所有INT64非固定长度字节数组的数据类型不同,是否有更好的方法来处理此问题?可能类似于将拼花文件读取为数据帧后,找出所有INT64非固定长度字节数组列,将它们转换为BIGINT,然后将数据帧另存为表
顺便说一句,我无法执行select*from my_from;即使在更改列的数据类型后,也在配置单元外壳中进行查询。我收到了错误消息
错误:编译语句时出错:失败:ParseException行1:30外部输入“limit”期望值接近state=42000,code=40000
我试过几张桌子,它们都有相同的问题
谢谢你的帮助 Parquet模式的警告int32意味着您的impala列类型应该是int而不是bigint。当您将表列更改为int时,它应该可以工作。
顺便说一句,火花和黑斑羚拼花地板的阅读方法是不同的。黑斑羚遵循一种更保守的方式来读取拼花地板文件。例如spark不能控制不同列索引中的值的数量,而impala可以。我在将拼花地板数据从s3复制到带小数列的红移时遇到了类似的问题。我正在
code: 15001
context: File 'https://s3.us-east-1.amazonaws.com/bucket/filename.snappy.parquet
has an incompatible Parquet schema for column
's3://bucket/filename/.column_name'. Column type: DECIMAL(9
红移列为小数点9,5。镶木地板上的柱子是双层的。由于生产原因,我无法更改数据库。我最终修改了拼花输出,如下所示:
val nineFive = DataTypes.createDecimalType(9,5)
val df2 = df.withColumn("column_name", $"column_name" cast nineFive)
四个不同的Apache项目—Hive、Parquet、Impala和Spark—意味着许多版本兼容性问题。参见从黑斑羚壳的角度来看,这个问题在黑斑羚2.11.0中得到了解决。我们使用的当前版本是Impala Shell v2.7.0-cdh5.9.1;不幸的是,我们无法在不久的将来升级黑斑羚壳。如前所述,当我们创建一个表而不是将列类型更改为BIGINT时,试图找到一种编程更正的方法。但我对INT64也有同样的问题,但我更关心与INT64相关的错误,因为我们在多个表中有许多这样的列。