【问题标题】:Split output to multiple files in Hive将输出拆分到 Hive 中的多个文件
【发布时间】:2019-07-31 09:40:37
【问题描述】:

我想根据一个属性在 Hive 中拆分 SQL 结果并将这些文件传输到 sFTP。

当前代码执行提取,但没有这两个要求。 在 SQL 结果中,我的属性很少。其中之一 - USER_ID - 必须作为截止点。识别出新 ID 后 - 必须创建新文件。

编辑 - 添加时间戳

beeline -u jdbc:hive2:<MYHOST> -n <USER> -p <PASSWORD> --silent=true --outputformat=csv2 -f <SQL FILE> > result_+%Y%m%d_%H%M%S.csv

目标是将一个文件(直线输出)拆分为多个 csv 文件,每个 USER_ID 位于 sFTP 位置。

直线脚本结果:

USER | ATTR1 | ATTR2 ID1 val val ID2 val val ID2 val val

改造后预期结果:

USER | ATTR1 | ATTR2 ID1 val val

USER | ATTR1 | ATTR2 ID2 val val ID2 val val

【问题讨论】:

  • 那么,你的代码只生成一个文件?
  • @F.Lazarescu - 完全正确
  • 而且您不想执行代码两次(在 select 语句上使用不同的过滤器?)。好像不能写beeline命令生成两个文件..
  • 我可以使用不同的过滤器(按 USER_ID)复制 SQL 代码并使用上面的脚本。但是,该解决方案需要生成更多脚本文件。这个概念是在直线中运行一个 SQL,然后使用 power shell 脚本拆分该文件。

标签: sql csv hive sftp file-transfer


【解决方案1】:

感谢@David C. Rankin

Split CSV file in bash into multiple files based on condition

awk -v 字段=a -v n=1 -v dt=$(日期'+%Y%m%d%H%M%S') 'FS=","; FNR == 1 {hdg=$0;下一个} a != $1 {a = $1; name=a"_file_"dt".csv"; n++; 打印 hdg >名称} {打印 $0 > 名称}' 样本文件.csv

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-22
    • 1970-01-01
    • 2021-11-29
    • 2014-08-13
    • 2020-12-07
    相关资源
    最近更新 更多