【问题标题】:Sqoop import newly added column to mysql table to existing hive tableSqoop将mysql表新增列导入现有hive表
【发布时间】:2017-02-22 11:04:18
【问题描述】:

我在mysql中有如下表测试:

id  name  address
1  Km  sky
2  hd  heaven
3  Ab  null
4  en  null

现在我做了如下的 sqoop 导入

sqoop import--connect jdbc:mysql://XXXXXX/testing --username XXXX --password XXXX --query "select * from  testing.test where \$CONDITIONS" --null-string '' --null-non-string '' -m 1\ 
--hive-import --hive-database testing --hive-table test --create-hive-table --target-dir  /user/hive/warehouse/testing.db/test

我得到了想要的结果。

然后我们在 mysql 表中添加了一个新的列,额外增加了 2 行

id  name  address  nation

1  Km  sky  null
2  hd  heaven  null
3  Ab  null  null
4  en  null  null
5  abc efd  USA
6  fge cde  UK

现在我想要更新上述列和行的现有配置单元表。我已经完成了以下 sqoop 工作

Sqoop 作业:

sqoop job --create sqoop_test -- import --connect jdbc:mysql:xxxxxxx/testing --username XXXXX --password XXXX --query "SELECT * from testing.test WHERE \$CONDITIONS" --incremental append\ 
--check-column id --last-value "3" --split-by 'id' --target-dir  /user/hive/warehouse/testing.db/test 

但是当我查询 hive 表时,我得到的结果为新行的 null 并且新列不显示。如下所示

id  name  address

NULL  NULL  NULL
NULL  NULL  NULL
1  Km  sky
2  hd  heaven
3  Ab  
4  en  

我们如何在 hive 的现有表中追加新列和新行?

或者我使用的方法是完全错误的。请告诉我

【问题讨论】:

  • 对于模式演化,您可以使用 avro 数据类型。对于增量数据,在 sqoop 中使用增量模式(lastmodified 用于更新)。

标签: mysql hive sqoop


【解决方案1】:

您的假设是错误的,原因是您正在导入具有不同布局的数据。您创建的第一个表有 3 列,在第二次导入中,您要导入 4 列,因此,Hive 无法解析这些新记录并简单地为所有列打印 null。如果您没有充分的理由以文本文件格式导入数据,我建议您在 avro 中创建表并使用模式演变功能添加新列。

当您在 avro 中导入数据时,Sqoop 会自动为您生成方案。所以您唯一需要做的就是创建一个指向导入数据的表并使用生成的模式。在未来导入新字段的情况下,您需要添加具有有效默认值的这些字段,或者使用以下默认值将它们设为可空(例如对于字符串列)

{ "name": "newcolumnname", "type": [ "null", "string" ], "default": "null" },

甚至指定其他有效的默认值

{ "name": "newcolumnname", "type": [ "string" ], "default": "val1" }, //default value 1
{ "name": "newcolumnname", "type": [ "string" ], "default": "" }, //default value empty

【讨论】: