5

Sqoop 与 HCatalog 导入一起使用时,即使在使用 Oracle 运行 Apache Sqoop 时在命令中使用了 --hive-drop-import-delims 选项后,也无法从列数据中删除新行 (\n)。

Sqoop 查询:

    sqoop import --connect jdbc:oracle:thin:@ORA_IP:ORA_PORT:ORA_SID \
--username user123 --password passwd123 -table SCHEMA.TBL_2 \ 
--hcatalog-table tbl2 --hcatalog-database testdb --num-mappers 1 \ 
--split-by SOME_ID --columns col1,col2,col3,col4 --hive-drop-import-delims \
--outdir /tmp/temp_table_loc --class-name "SqoopWithHCAT" \
--null-string ""

Oracle Column col4中的数据如下:(数据有^M等控制字符)

<li>Details:^M
    <ul>^M
        <li>

控制字符是否会导致此问题?

我错过了什么吗?这个问题有什么解决方法或解决方案吗?

4

3 回答 3

10

使用--map-column-java选项显式声明该列的类型为String。然后--hive-drop-import-delims按预期工作(\n从数据中删除)。

更改 Sqoop 命令:

sqoop import --connect jdbc:oracle:thin:@ORA_IP:ORA_PORT:ORA_SID \
--username user123 --password passwd123 -table SCHEMA.TBL_2 \ 
--hcatalog-table tbl2 --hcatalog-database testdb --num-mappers 1 \ 
--split-by SOME_ID --columns col1,col2,col3,col4 --hive-drop-import-delims \
--outdir /tmp/temp_table_loc --class-name "SqoopWithHCAT" \
--null-string "" --map-column-java col4=String
于 2015-02-10T04:34:31.257 回答
5
sqoop import \
--connect jdbc:oracle:thin:@ORA_IP:ORA_PORT:ORA_SID \
--username 123 \
--password 123 \
--table SCHEMA.TBL_2 \
--hcatalog-table tbl2 --hcatalog-database testdb --num-mappers 1 \
--split-by SOME_ID --columns col1,col2,col3,col4 \
--hive-delims-replacement "anything" \
--outdir /tmp/temp_table_loc --class-name "SqoopWithHCAT" \
--null-string ""

您可以试试这个 --hive-delims-replacement "anything" 这将用您提供的字符串替换所有 \n 、 \t 和 \01 字符(在这种情况下用字符串“anything”替换)。

于 2015-02-10T20:45:27.917 回答
0

来自官网: https ://sqoop.apache.org/docs/1.4.2/SqoopUserGuide.html

如果数据库的行包含具有 Hive 的默认行分隔符(\n 和 \r 字符)或列分隔符(\01 字符)的字符串字段,Hive 使用 Sqoop 导入的数据将出现问题。您可以使用 --hive-drop-import-delims 选项在导入时删除这些字符,以提供与 Hive 兼容的文本数据。或者,您可以使用 --hive-delims-replacement 选项在导入时将这些字符替换为用户定义的字符串,以提供与 Hive 兼容的文本数据。仅当您使用 Hive 的默认分隔符时才应使用这些选项,如果指定了不同的分隔符,则不应使用这些选项。

于 2019-02-27T05:33:26.850 回答