Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 拼花地板数据类型问题_Scala_Apache Spark_Apache Spark Sql_Parquet - Fatal编程技术网

Scala 拼花地板数据类型问题

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但不是固定字节数组的列都存在此问题 所以

我有一堆拼花地板文件,我已经用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但不是固定字节数组的列都存在此问题

所以我手动执行了这个命令

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相关的错误,因为我们在多个表中有许多这样的列。