当\t
在值中且分隔符也是\t
时,我们如何处理Hive中的数据。例如,假设有一列为Street
,数据类型为String
,值为XXX\tYYY
,在创建表格时,我们将字段分隔符用作\t
。分隔符将如何工作?在这种情况下,值中的\t
也会被分隔吗?
答案 0 :(得分:2)
如果\t
值的列被"
之类的引号字符括起来,则可以使用csv-serde来解析数据,如下所示:
以下是我已加载的示例数据集:
R1Col1 R1Col2 "R1Col3 MoreData" R1Col4
R2Col2 R2Col2 "R2Col3 MoreData" R2Col4
从蜂巢控制台注册jar
hive> add jar /path/to/csv-serde-1.1.2-0.11.0-all.jar;
使用指定的serde和自定义属性
创建一个表hive> create table test_table(c1 string, c2 string, c3 string, c4 string)
> row format serde 'com.bizo.hive.serde.csv.CSVSerde'
> with serdeproperties(
> "separatorChar" = "\t",
> "quoteChar" = "\"",
> "escapeChar" = "\\"
> )
> stored as textfile;
将数据集加载到表格中:
hive> load data inpath '/path/to/file/in/hdfs' into table test_table;
执行select * from test_table
检查结果
您可以从here下载csv-serde。
答案 1 :(得分:1)
它会将它视为分隔符,是的,就像你有一个分号一样;在值中并告诉它以分号分割 - 当扫描文本时,它将看到该字符并将其解释为字段的边缘。
为了解决这个问题,我使用sed在将字符加载到Hive之前查找并替换字符,或者使用不同的分隔符创建Hive表,或者将其保留为默认的^ A或\ 001,然后,当我提取它时,在输出上使用sed用逗号或制表符或我需要的任何东西替换\ 001。在命令行上运行 sed -i's / oldval / newval / g'文件将替换文件中的字符。
您是否有理由选择使用\ t作为分隔符来创建表,而不是^ A的默认Hive字段分隔符?由于tab在文本中是一个相当常见的字符,并且Hadoop / Hive在处理文本时被大量使用,因此很难找到一个好的字符来分隔。
答案 2 :(得分:0)
我们在数据加载中遇到了与hadoop集群相同的问题。我们做了什么,每当我们看到分隔符包含在数据字段中并在表定义中添加以下内容时添加\\t
。
由\t
终止的\\
行终止的行格式分隔字段由\n
终止的<{1}}