我在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
现在我希望现有的hive表更新上面的列和行。我做了以下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中添加新列并将新行添加到现有表中?
或者我使用的方法是完全错误的。请让我知道
答案 0 :(得分:1)
您的假设是错误的,原因是您导入的数据采用不同的布局。您创建的第一个表有3列,在第二个导入中,您要导入4列,因此,Hive无法解析这些新记录,只需为所有列打印null。如果您没有充分的理由以文本文件格式导入数据,我建议您使用avro创建表,并使用模式演变功能添加新列。
当您在avro中导入数据时,Sqoop会为您自动生成方案。所以你唯一需要的是创建一个指向导入数据的表并使用生成的模式。对于将来使用新字段导入的情况,您需要添加具有有效默认值的字段,或者使用默认值将其设为nullables,如下所示(例如,对于字符串列)
{ "name": "newcolumnname", "type": [ "null", "string" ], "default": "null" },
或甚至指定其他有效的默认值
{ "name": "newcolumnname", "type": [ "string" ], "default": "val1" }, //default value 1
{ "name": "newcolumnname", "type": [ "string" ], "default": "" }, //default value empty