Sqoop:如何添加一个额外的列来输出和替换空字符串?

时间:2014-07-21 09:51:43

标签: hadoop sqoop

我有一个包含以下列的SQL表:

name, fname, e-mail, phone

如何使用Sqoop将此表导入HDFS上的CSV文件:

  1. 额外的phone2列,以便具有以下格式的输出CSV记录:

    姓名,姓名,电子邮件,电话,电话2

  2. 其中phone2所有输出记录的值为udef

    1. 某些输入记录可能有一个空的e-mail字段,这会产生包含,,字段的CSV行,如下所示:

      约翰史密斯,, 1234567

    2. 如何用,,字符串替换undef空字符串?要使CSV包含以下记录:

      John,Smith,undef,1234567,undef    Tom,Brooks,toom @ abc.com,78979878,undef    ...    等

2 个答案:

答案 0 :(得分:2)

Sqoop可以接受查询,因此除了指定--null-string和--null-non-string选项之外,您还可以指定要导出的任何旧查询。对您而言,您的查询非常简单:

select name, fname, e-mail, phone, null AS phone2 FROM people

然后你只需将它放在你的sqoop命令中。请注意,您可能需要执行--map-column-java来告诉sqoop您希望列具有哪些数据类型,因为使用自定义查询,它不会是nec。能够搞清楚。

sqoop \
  --query 'select name, fname, e-mail, phone, null AS phone2 FROM people'
  --null-string UNDEF
  --null-non-string UNDEF
  ... connection info and other options, if nec....

奖励提示:某些数据库可以在启用了--direct选项的情况下超快速导出,因此您可能需要查看该内容,具体取决于您的表格大小。

答案 1 :(得分:1)

据我所知,在将SQL数据导入Sqoop时,无法添加Extra列。 但是可以使用null-string将空值更改为其他值。例如,

sqoop import \
  --connect jdbc:mysql://mysql.example.com/sqoop \
  --username sqoop \
  --password sqoop \
  --table cities \
  --null-string 'UNDEF' \
  --null-non-string 'UNDEF'

上面的代码将空值更改为'UNDEF'。