【问题标题】:Redirect stdout from unix to hadoop without writing file in Unix将标准输出从 unix 重定向到 hadoop,而不在 Unix 中写入文件
【发布时间】:2022-08-13 20:45:06
【问题描述】:

我有一个过程可以下载文件,然后解压缩文件,然后将其发送到 HDFS。 我们看到了一种使用以下命令对其进行优化的方法--to-stdout它为我们创造了奇迹:

gunzip --to-stdout \"${FULLNAME}\" | hdfs dfs -put - \"${path_folder}/${PROCESS}\"

我的问题是关于标准输出:

是否可以用 sql 查询做类似的事情?也就是把你得到的结果扔出去,用文件名发送到HDFS?

我们有这样的东西可以生成一个文件,然后将其发送到 hdfs。

sqlplus -S user/password@dbname << EOF > file_name.txt
    set feedback off trimspool on
    select * from table_name;
    exit;
EOF

hdfs dfs -put file_name.txt ${path_folder}

我想知道的是,是否有一种方法可以从输出中获取输出而不将其重定向到文件,而是直接,就像我解压缩的示例一样,将其发送到 HDFS?

  • 不要忘记双引号 $path_folder

标签: linux bash shell unix hadoop


【解决方案1】:

就像您最初的示例一样,您也可以使用管道 (|) 来重定向您的 sqlplus 命令。只需将管道与第一个 EOF 放在同一行:

sqlplus -S user/password@dbname << EOF | hdfs dfs -put - ${path_folder}/file_name.txt
    set feedback off trimspool on
    select * from table_name;
    exit;
EOF

【讨论】:

  • 非常感谢 Omajid 的回答。我刚刚尝试过,唯一看到的是它生成了文件但没有名称。有什么方法可以“命名”该标准输出以便能够将其放入 hdfs 中?
  • 您可以使用hdfs dfs -put - ${path_folder}/file_name.txt 并指定目标文件名
【解决方案2】:

只需按照您的示例重定向

sqlplus -S user/password@dbname <<EOF | hdfs dfs -put - ${path_folder}
    set feedback off trimspool on
    select * from table_name;
    exit;
EOF

如果可以将其重定向到文件,则可以将其重定向到管道。

【讨论】:

  • 问候迭戈。我已经尝试过了,它可以工作,但它会生成一个没有名称的文件。你知道是否可以给这个标准输出命名以便能够将其放入 hdfs 中吗?
猜你喜欢
  • 1970-01-01
  • 2013-02-10
  • 1970-01-01
  • 2014-04-30
  • 2012-03-13
  • 1970-01-01
  • 1970-01-01
  • 2011-11-15
  • 1970-01-01
相关资源
最近更新 更多