如何解决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<>>
时。
第三: [] 中的所有内容都是一个数组。 {} 中的所有内容都是结构体或映射,在您的情况下它是结构体,而您错过了这条规则。字段 user
、id
和 desc
位于 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 举报,一经查实,本站将立刻删除。