我正在尝试将表定义从一个配置单元元存储迁移到另一个配置单元元存储。
源群集具有:
Spark1.6.0
Hive1.1.0(cdh)
高密度光纤
目标群集是具有以下功能的emr群集:
Spark2.1.1
Hive2.1.1
s3级
要迁移表,我执行了以下操作:
将数据从hdfs复制到s3
跑 SHOW CREATE TABLE my_table;
在源集群中
修改返回的create query-change LOCATION
从hdfs路径到s3路径
在目标群集的配置单元上运行修改后的查询
跑 SELECT * FROM my_table;
. 这将返回0行(应为)
跑 MSCK REPAIR TABLE my_table;
. 这将按预期传递并在元存储中注册分区。
跑 SELECT * FROM my_table LIMIT 10;
-返回10行正确的值
在目标群集上,从配置为使用配置单元元存储的spark运行以下代码: spark.sql("SELECT * FROM my_table limit 10").show()
-返回空值!
spark sql查询返回的结果具有所有正确的列和正确的行数,但所有值都为null。
为了让spark正确地加载这些值,我可以将以下属性添加到 TBLPROPERTIES
创建查询的一部分:
'spark.sql.partitionProvider'='catalog',
'spark.sql.sources.provider'='org.apache.spark.sql.parquet',
'spark.sql.sources.schema.numPartCols'='<partition-count>',
'spark.sql.sources.schema.numParts'='1',
'spark.sql.sources.schema.part.0'='<json-schema as seen by spark>'
'spark.sql.sources.schema.partCol.0'='<partition name 1>',
'spark.sql.sources.schema.partCol.1'='<partition name 2>',
...
这个问题的另一方面是,在源集群中,spark读取表值时没有任何问题,也没有额外的错误 TBLPROPERTIES
.
为什么会这样?怎么能修好呢?
暂无答案!
目前还没有任何答案,快来回答吧!