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: [] 中的所有内容都是一个数组。 {} 中的所有内容都是一个结构或映射,在您的情况下它是一个结构,您错过了这条规则。字段 user
、id
和 desc
位于结构内部,而结构嵌套在数组内部。数组在它的定义中只能有类型,如果它是嵌套结构,那么它将是 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 手册中阅读更多内容。
我正在尝试为 .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: [] 中的所有内容都是一个数组。 {} 中的所有内容都是一个结构或映射,在您的情况下它是一个结构,您错过了这条规则。字段 user
、id
和 desc
位于结构内部,而结构嵌套在数组内部。数组在它的定义中只能有类型,如果它是嵌套结构,那么它将是 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 手册中阅读更多内容。