无法在具有自定义分隔符的配置单元中插入数据

ao218c7q  于 2021-06-02  发布在  Hadoop
关注(0)|答案(2)|浏览(350)

我试图学习Hive,这可能是一个愚蠢的问题,但我创建了一个Hive表如下

create table if not exists tweets_table( 
     tweetdata STRING,
     followerscount INT,
     friendscount INT,
     statuscount INT,
     retweetcount INT,
     favouritescount INT,
     lang STRING,
     placefullname STRING,
     placename STRING,
     countryname STRING,
     countrycode STRING,
     hashtags STRING)
     ROW FORMAT DELIMITED
     FIELDS TERMINATED BY '^**^'
     LINES TERMINATED BY '\n'
     STORED AS TEXTFILE;

LOAD  DATA LOCAL INPATH  '/home/cloudera/Desktop/TestDB.txt' INTO TABLE tweets_table5 ;

我用“^**^”来分隔文本,因为tweets有很多“\n\r”(如果有的话,请建议一个标准的做法)
所以我有一个文本文件,我正在尝试加载

09-09-2016 10:51:33|^**^|@ArvindKejriwal @abpnewstv तुम्हारे दावों का क्या हुआ केजरीवाल।|^**^|74|^**^|30|^**^|0|^**^|98|^**^|0|^**^|49|^**^|en|^**^|Ambikapur, India|^**^|Ambikapur|^**^|India|^**^|IN|^**^|[]
09-09-2016 10:51:37|^**^|@LiveLawIndia It is shocking a judge  arrested. I am sure Higher Judiciary will come their rescue , Judges per se cannot be wrong|^**^|0|^**^|14|^**^|0|^**^|32|^**^|0|^**^|2|^**^|en|^**^|Rajasthan, India|^**^|Rajasthan|^**^|India|^**^|IN|^**^|[]

在成功加载并查询它之后,我得到以下输出

09-09-2016 10:51:33|   NULL    NULL    NULL    NULL    NULL    |30|  **|0|**|98|  **
 09-09-2016 10:51:37|   NULL    NULL    NULL    NULL    NULL    |14|  **|0|**|32|  **

我不明白我哪里做错了是在我的文件里还是在Hive表里。请帮忙

wgmfuz8q

wgmfuz8q1#

您尝试执行的操作有几个问题:
使用 FIELDS TERMINATED BY 分隔符不能超过1个字符。
即使这样做有效,也不能解决tweet中有行分隔符的问题 \n 在tweet中开始新的一行。
您描述表的方式—不可能正确解析—您不能 \n 作为行分隔符和在tweet数据中。如果您是生成此输入文件的人,我建议将所有 \n 以及 \r 在有空格的推特上。

pjngdqdw

pjngdqdw2#

使用regex serde而不是默认配置单元serde创建表。
根据列数修改下面的正则表达式:

^(.+)\|\^\*\*\^\|(.+)\|\^\*\*\^\|(.+)\|\^\*\*\^\|(.+)\|\^\*\*\^\|(.+)\|\^\*\*\^\|(.+)\|\^\*\*\^\|(.+)\|\^\*\*\^\|(.+)\|\^\*\*\^\|(.+)\|\^\*\*\^\|(.+)\|\^\*\*\^\|(.+)\|\^\*\*\^\|(.+)\|\^\*\*\^\|(.+)\|\^\*\*\^\|(.+)$

表格:

create external table if not exists tweets_table( 
     tweetdata STRING,
     followerscount INT,
     friendscount INT,
     statuscount INT,
     retweetcount INT,
     favouritescount INT,
     lang STRING,
     placefullname STRING,
     placename STRING,
     countryname STRING,
     countrycode STRING,
     hashtags STRING)
ROW FORMAT SERDE 'org.apache.hadoop.hive.contrib.serde2.RegexSerDe'
WITH SERDEPROPERTIES  (
"input.regex" = " ^(.+)\|\^\*\*\^\|(.+)\|\^\*\*\^\|(.+)\|\^\*\*\^\|(.+)\|\^\*\*\^\|(.+)\|\^\*\*\^\|(.+)\|\^\*\*\^\|(.+)\|\^\*\*\^\|(.+)\|\^\*\*\^\|(.+)\|\^\*\*\^\|(.+)\|\^\*\*\^\|(.+)\|\^\*\*\^\|(.+)\|\^\*\*\^\|(.+)\|\^\*\*\^\|(.+)$",
"output.format.string" = "%1$s %2$s %3$s %4$s %5$s %6$s %7$s %8$s %9$s %10$s %11$s %12$s %13$s"
)
STORED AS TEXTFILE;

加载数据:

LOAD  DATA LOCAL INPATH  '/home/cloudera/Desktop/TestDB.txt' INTO TABLE tweets_table ;

如果你得到 RegexSerDe classNotFoundException 然后添加regex serde jar:

ADD JAR hive-contrib=x.x.x.jar

相关问题