hive Package 在[]中的原始数据的DDL配置单元SQL

tag5nh1u  于 12个月前  发布在  Hive
关注(0)|答案(1)|浏览(133)

Package 在[]中的原始数据的DDL配置单元SQL
你好
所以我有一个.txt数据由1000行数据组成,格式如下:[a,“B”,c,d,“e”,f,“123,4567,89101,2345”]
我想根据它们创建配置单元表,并尝试了下面的DDL查询:

CREATE TABLE table_name(
col1 int,
col2 string,
col3 bigint,
col4 int,
col5 string,
col6 int
col7 array<string>
)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
COLLECTION ITEMS TERMINATED BY ','
MAP KEYS TERMINATED BY '\001'

而当我将txt文件加载到创建的表格中时,似乎呈现的数据不是我想要的,表格的内容应该在哪里:
| col1| col2| col3| col4| col5| col6| col7|
| - -----|- -----|- -----|- -----|- -----|- -----|- -----|
| a| B| c型|d| e的|关闭|123、4567、89101、2345|
而实际情况是
| col1| col2| col3| col4| col5| col6| col7|
| - -----|- -----|- -----|- -----|- -----|- -----|- -----|
| [a|“B”|c型|d|“e”|关闭|[123]]|
问题是- col 1的值包含在'[',与col 7相同,包含']' -一些列的值仍然包含“”,-col 7的值被截断,我认为系统将,in“”值识别为分隔符。
我还是不知道怎么解决。有什么建议吗?先谢谢你了

dphi5xsq

dphi5xsq1#

我建议在将数据加载到表中之前,使用脚本或sed或awk等工具删除输入文件中的前导和尾随字符[]
要将每行都包含带引号和不带引号字段的文件导入配置单元表,请使用ROW FORMAT SERDE子句指定可处理带逗号的带引号字段的自定义序列化器-解串器(SerDe)。Hive提供的OpenCSVSerde可以实现以下功能:例如

CREATE TABLE table_name(
  col1 int,
  col2 string,
  col3 bigint,
  col4 int,
  col5 string,
  col6 int,
  col7 array<string>
)
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde'
WITH SERDEPROPERTIES (
  "separatorChar" = ",",
  "quoteChar"     = "\""
)
LOCATION '/path/to/myfile';

参见:OpenCSVSerDe for processing CSV
要使用Python从文件的每一行中删除前导[和尾随]字符,您可以逐行读取文件并使用strip()方法,例如:

with open('input_file.txt', 'r') as infile, open('output_file.txt', 'w') as outfile:
    for line in infile:
        line = line.strip('[]\n')
        outfile.write(line + '\n')

未经测试!

相关问题