【问题标题】:Hive: Is it possible to use regexp_extract on a struct field? (NullPointerException)Hive:是否可以在结构字段上使用 regexp_extract? (空指针异常)
【发布时间】:2017-08-09 17:00:19
【问题描述】:

我将一个充满 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"}}

我像这样创建了配置单元表:

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

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

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

【问题讨论】:

  • 你能发布导致 NullPointerException 的堆栈跟踪吗?它通常在一个单独的 hivelogs 文件夹中
  • 我不确定这是否是堆栈跟踪,但我已将 hive.log 上传到 vaughn-s.net/hadoop/hive.log
  • 我在该日志中的任何地方都没有看到 NullPointerException...
  • 不幸的是,我不确定在哪里可以找到堆栈跟踪,尤其是在 amazon emr 上。我希望我能提供更多帮助。

标签: json regex hive amazon-dynamodb


【解决方案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,则必须事先从内容中删除所有逗号。

【讨论】:

  • 感谢您的帮助,不胜感激。有没有更好的方法来处理引号?如果我将 dynamodb 导入为 csv,有没有办法处理推文中的所有逗号?
  • 太好了,很有帮助!再次感谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多