【问题标题】:unable to insert data in hive having custom delimiter无法在具有自定义分隔符的配置单元中插入数据
【发布时间】:2016-10-30 19:28:42
【问题描述】:

我正在尝试学习 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 ;

我使用'^**^'来分隔文本,因为推文中有很多“\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|    **

我不明白我哪里出错了,是在我的 tex tfile 还是 hive 表中。请帮忙

【问题讨论】:

    标签: file hadoop hive bigdata database


    【解决方案1】:

    你正在尝试做的几个问题:

    使用FIELDS TERMINATED BY 分隔符不能超过 1 个字符。

    即使这样有效,也不能解决您的推文中包含行分隔符的问题 - 推文中的每个 \n 都会开始一个新行。

    您描述表格的方式 - 无法正确解析 - 您不能将 \n 作为行分隔符和推文数据。如果您是生成此输入文件的人,我建议将推文中的所有\n\r 替换为空格。

    【讨论】:

      【解决方案2】:

      regex serde 代替默认的hive 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 然后添加正则表达式 serde jar:

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

      【讨论】:

      • 这个正则表达式正是我正在寻找的,但是,我收到一个错误 FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask。 java.util.regex.PatternSyntaxException:在索引 9 附近悬挂元字符 '*' ^(.+)|^**^|(.+)|^**^|(.+)|^**^|(. +)|^**^|(.+)|^**^|(.+)|^**^|(.+)|^**^|(.+)|^**^|(. +)|^**^|(.+)|^**^|(.+)|^**^|(.+)|^**^|(.+)|^**^|(. +)$
      • 移除 output.format.string 参数。将您的文件放在 hdfs 中,而不是使用此正则表达式创建外部表,而不是内部表。
      猜你喜欢
      • 1970-01-01
      • 2015-09-14
      • 1970-01-01
      • 2015-09-08
      • 1970-01-01
      • 2015-12-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多