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

Hive external table read json as textfile

我正在尝试为 .txt 格式的 json 文件创建外部配置单元 table。我已经尝试了几种方法,但我认为我在如何定义配置单元外部 table 方面出错了:

我的样本 JSON 是:

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


}]]

如您所见,它是数组中的数组。看起来这是有效的 json,由 API 返回,尽管我读过帖子说 json 应该以 '{'

开头

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

    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 * 查询它。我在 table 结构中遗漏了一个关键部分。

你能帮我让table能正确阅读我的JSON吗?

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

1st: table 中的行应在文件中表示为单行,而不是多行 JSON.

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

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

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

如果您希望单列 colname 包含 array<array<struct<...>>>,则创建 table 如下:

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"}]]

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

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

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

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

希望您了解它的工作原理。在 JSONSerDe 手册中阅读更多内容。