Hive:是否可以在struct字段上使用regexp_extract? (空指针异常)

时间:2017-08-09 17:00:20

标签: json regex hive amazon-dynamodb

我将一个充满twitter信息(json格式)的dynamodb加载到hive中。 json文件的格式如下所示:

{"id":{"s":"894643473017561088"},"sentiment":{"s":"neutral"},"subjectivity":{"s":"0.0"},"username":{"s":"Jessi"},"geo":{"s":"None"},"location":{"s":"Valley of the sun☀️"},"polarity":{"s":"0.0"},"tweet":{"s":"b\"RT @bannerite: Donald Trump's lies have consequences. We're seeing them now | Charlotte Observer #DemForce""},"created_at":{"s":"Mon Aug 07 19:36:40 +0000 2017"},"screen_name":{"s":"JessiAtkins06"},"followers_count":{"s":"19"}}

我像这样创建了一个hive表:

create external table table1 (
    > id struct<s:string>,
    > sentiment struct<s:string>,
    > subjectivity struct<s:string>,
    > username struct<s:string>,
    > geo struct<s:string>,
    > location struct<s:string>,
    > polarity struct<s:string>,
    > tweet struct<s:string>,
    > created_at struct<s:string>,
    > screen_name struct<s:string>,
    > followers_count struct<s:string>)
    > ROW FORMAT SERDE 'org.apache.hive.hcatalog.data.JsonSerDe'
    > STORED AS TEXTFILE;

然后使用通常的“load data inpath ...”公式从json文件加载数据。

我需要从“tweet”字段中提取主题标签,但是当我尝试使用正则表达式搜索主题标签时,我收到错误:

hive> select regexp_extract(lower(tweet), '/\B#\w*[a-zA-Z]+\w*/',0) as patterns
    > from table1
    > limit 10;
FAILED: NullPointerException null

我想知道这是否是因为字段的结构格式。我本可以将dynamo文件导出为csv,但推文中有许多逗号。无论int字段是设置为0,1还是2,都会发生相同的错误。

我正在尝试确定该字段中的哪个值为null并且我真的不确定 - 我在一个由字符串类型字段组成的表上尝试了类似的命令并且它有效。我看过“什么是NullPointerException,我该如何修复它?”线程但仍然不知道;任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

我回溯了你的步骤并收到了NullPointerException。

接下来,我运行了一个更简单的查询并得到了这个:

select tweet from table1;
OK
Failed with exception java.io.IOException:org.apache.hadoop.hive.serde2.SerDeException: org.codehaus.jackson.JsonParseException: Unexpected character ('"' (code 34)): was expecting comma to separate OBJECT entries

似乎在您的示例输入数据中,您有一个额外的"(在#DemForce之后)打破了json反序列化。

您可以在推文中的每个\之前添加",以便将"视为文字。

如果您导出为csv,则必须事先从内容中删除所有逗号。