Hive 如何在配置单元中使用多个分隔符

Hive 如何在配置单元中使用多个分隔符,hive,delimiter,Hive,Delimiter,我有一个这样的输入数据集 “用户ID”|“州”、“市”、“国家”|“区号” “203448”|“艾尔斯伯里,不适用,英国”|\n 在这里,和作为分隔符 如何在配置单元中创建表时使用这两个分隔符。我建议将输入文件的每一行完整地摄取到一个具有单个字符串列的暂存表中,然后使用一个正则表达式拆分每个输入行,该正则表达式将在逗号和管道上设置键。例如: DROP TABLE IF EXISTS staging; CREATE TABLE staging (rawdata STRING); LOAD DATA

我有一个这样的输入数据集

“用户ID”|“州”、“市”、“国家”|“区号”

“203448”|“艾尔斯伯里,不适用,英国”|\n

在这里,和作为分隔符


如何在配置单元中创建表时使用这两个分隔符。

我建议将输入文件的每一行完整地摄取到一个具有单个字符串列的暂存表中,然后使用一个正则表达式拆分每个输入行,该正则表达式将在逗号和管道上设置键。例如:

DROP TABLE IF EXISTS staging;
CREATE TABLE staging (rawdata STRING);
LOAD DATA LOCAL INPATH 'test.data' INTO TABLE staging;
-- I put your data into a local file called "test.data" - change your path accordingly
因此,使用您的数据,暂存表现在看起来如下所示:

hive> SELECT * FROM staging;
OK
"UserID"|"State","City","Country"|"Area Code"
"203448"|"aylesbury, n/a, united kingdom"|\N
Time taken: 0.452 seconds, Fetched: 2 row(s)
然后您可以创建最终的表(我任意将其命名为“target”,替换为您自己的名称):

将列名替换为所需的列标题。在任何情况下,这都是创建后目标表的结果内容(我已通过
sed
将显示的结果管道化,以
而不是选项卡来分隔字段,我认为这些选项卡不可读):


使用
作为分隔符创建表,然后在创建表后拆分
|
上的列。你可以参考这个。试试这个:在与一个类似的问题斗争了几天后,我还建议在导入到配置单元时使用Rchang的答案来处理任何唯一的分隔符字符串。“行”在配置单元关键字列表中。使用类似于“AS i FROM staging”的内容,而不是“AS row FROM staging”,然后将行[0]…行[4]更改为行[0]…行[4]。
DROP TABLE IF EXISTS target;
CREATE TABLE target AS SELECT
  i[0] AS columnNameA,
  i[1] AS columnNameB,
  i[2] AS columnNameC,
  i[3] AS columnNameD,
  i[4] AS columnNameE
FROM (SELECT split(rawdata, ",|\\|") AS i FROM staging) t;
# hive -e "select * from target" 2>/dev/null | sed 's/\t/ :: /g'
"UserID" :: "State" :: "City" :: "Country" :: "Area Code"
"203448" :: "aylesbury ::  n/a ::  united kingdom" :: NULL