微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Hive 外部表读取 json 作为文本文件

如何解决Hive 外部表读取 json 作为文本文件

我正在尝试为 .txt 格式的 json 文件创建一个 hive 外部表。我尝试了几种方法,但我认为应该如何定义 hive 外部表是错误的:

我的示例 JSON 是:

[[
{
    "user": "ron","id": "17110","addr": "Some address"
},{
    "user": "harry","id": "42230","addr": "some other address"


}]]

如您所见,它是数组内的数组。这似乎是有效的 json,由 API 返回,尽管我读过一些帖子说 json 应该以 '{'

开头

无论如何,我正在尝试创建一个这样的外部表:

    CREATE EXTERNAL TABLE db1.user(
    array<array<
    user:string,id:string,desc:string
    >>)
  PARTITIONED  BY(date string)
  ROW FORMAT SERDE 'org.apache.hive.hcatalog.data.JsonSerDe'
  STORED AS TEXTFILE
  LOCATION '/tmp/data/addr'

这不起作用。类似的东西也不起作用

CREATE EXTERNAL TABLE db1.user(
    user string,id string,desc string

 )PARTITIONED  BY(date string)
  ROW FORMAT SERDE 'org.apache.hive.hcatalog.data.JsonSerDe'
  STORED AS TEXTFILE
  LOCATION '/tmp/data/addr'

在尝试修改 json 文本文件后,将 [ 替换为 { 等,添加分区后我仍然无法使用 select * 查询它。我缺少表结构中的一个关键部分。

你能帮我让表正确读取我的 JSON 吗?

如果需要,我可以修改输入 JSON,如果双 [[ 有问题。

解决方法

第一:表中的行应在文件中表示为单行,而不是多行 JSON。

第二个:您可以将 array<some complex type> 作为单个列,但这并不方便,因为您需要分解数组才能访问嵌套元素。您可能需要这种结构的唯一原因是当确实有多行带有 array<array<>> 时。

第三: [] 中的所有内容都是一个数组。 {} 中的所有内容都是结构体或映射,在您的情况下它是结构体,而您错过了这条规则。字段 useriddesc 位于 struct 内部,而 struct 嵌套在数组内部。数组在其定义中只能有类型,如果是嵌套结构,则为array<struct<...>>,如果数组为简单类型,则例如array<string>

第四:您的 JSON 无效,因为它在地址值后包含额外的逗号,请修复它。

如果您更喜欢包含 colname 的单列 array<array<struct<...>>>,则创建如下表:

CREATE EXTERNAL TABLE db1.user(
    colname array<array<
    struct<user:string,id:string,desc:string>
    >>)...

JSON 文件应如下所示(每行单行):

[[{"user": "ron","id": "17110","addr": "Some address"},{"user": "harry","id": "42230","addr": "some other address"}]]

如果文件包含嵌套在另一个数组中的单个大数组,最好删除 [[ 和 ]],删除结构之间的逗号和结构内的额外换行符。如果单行是一个结构{},你可以定义你的表没有上结构,只有嵌套结构应该定义为结构:

CREATE EXTERNAL TABLE db1.user(
    user string,id   string,desc string
   )...

请注意,在这种情况下,列名和类型之间不需要 :。仅在嵌套结构中使用 :。 JSON 应该是这样的(DDL 中定义的整个 JSON 对象在一行中,结构之间没有逗号,每个结构在单独的一行中):

{"user": "ron","addr": "Some address"}
{"user": "harry","addr": "some other address"}

希望你知道它是如何工作的。在 JSONSerDe 手册中阅读更多内容。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?