Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Json 配置单元服务器处理嵌套结构时出现问题_Json_Struct_Hive - Fatal编程技术网

Json 配置单元服务器处理嵌套结构时出现问题

Json 配置单元服务器处理嵌套结构时出现问题,json,struct,hive,Json,Struct,Hive,我正在尝试使用json serde将具有嵌套结构的大量json数据加载到配置单元中。在嵌套结构中,某些字段名以$开头。我正在使用SerDeproperties映射配置单元文件名,但是当我查询表时,从$开始的字段中得到null,尝试使用不同的语法,但没有成功 示例JSON: { "_id" : "319FFE15FF90", "SomeThing" : { "$SomeField" : 22, "AnotherFie

我正在尝试使用json serde将具有嵌套结构的大量json数据加载到配置单元中。在嵌套结构中,某些字段名以
$
开头。我正在使用
SerDeproperties
映射配置单元文件名,但是当我查询表时,从
$
开始的字段中得到null,尝试使用不同的语法,但没有成功

示例JSON:

{
    "_id" : "319FFE15FF90",
    "SomeThing" : 
    {
            "$SomeField"     : 22,
            "AnotherField"   : 2112,
            "YetAnotherField":    1
    }
 . . . etc . . . .
使用以下模式:

create table testSample
( 
    `_id` string, 
    something struct
    <
        $somefield:int,
        anotherfield:bigint, 
        yetanotherfield:int
    >
) 
row format serde 'org.openx.data.jsonserde.JsonSerDe' 
with serdeproperties
(
    "mapping.somefield" = "$somefield"
);
创建表testSample
( 
`_id`string,
结构物
<
$somefield:int,
另一个字段:bigint,
yetanotherfield:int
>
) 
行格式serde'org.openx.data.jsonserde.jsonserde'
具有serdeproperty
(
“mapping.somefield”=“$somefield”
);
此架构构建为OK,但是,上表中的somefield(以
$
开头)始终返回null(所有其他值都存在且正确)

我们已经尝试了很多语法组合,但都没有用


有人知道在嵌套字段的名称中加一个前导的
$
的诀窍吗?

你几乎猜对了。尝试这样创建表。 您犯的错误是,在serde属性(mapping.somefield=“$somefield”)中进行映射时,您说的是“在查找名为'somefield'的配置单元列时,查找json字段'$somefield',但在配置单元中,您使用美元符号定义了列,如果不是完全非法的,这肯定不是配置单元中的最佳做法

create table testSample
(
`_id` string,
something struct
<
    somefield:int,
    anotherfield:bigint,
    yetanotherfield:int
  >
)
row format serde 'org.openx.data.jsonserde.JsonSerDe'
with serdeproperties
(
"mapping.somefield" = "$somefield"
);

我突然也发现了这个问题,但是对于普通的列名(没有特殊字符,比如$)

我正在从另一个内部表(表2)填充外部表(Temp)并且希望以JSON格式输出临时表。我希望在输出JSON文件中使用驼峰大小写的列名,因此我还使用临时表中的serdeperties指定正确的名称。但是,我发现,当我从临时表中选择*时,它会为映射中使用名称的列提供空值

我正在运行Hive 0.13。以下是命令:

创建表格命令:

CREATE EXTERNAL TABLE Temp (
    data STRUCT<
        customerId:BIGINT, region:STRING, marketplaceId:INT, asin:ARRAY<STRING>>
) 
ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe' 
WITH SERDEPROPERTIES ( 
    'mapping.customerid' = 'customerId',
    'mapping.marketplaceid' = 'marketplaceId'
) 
LOCATION '/output'; 

INSERT INTO TABLE Temp
    SELECT 
        named_struct ('customerId',customerId, 'region', region, 'marketplaceId', marketplaceId, 'asin', asin) 
    FROM Table2;
查看“customerid”和“marketplaceid”如何为空。生成的JSON文件为:

{"data":{"region":"EU","asin":["B000FC1PZC"]}}
{"data":{"region":"EU","asin":["B000FC1C9G"]}}
现在,如果删除with SERDEPROPERTY,表将开始获取所有值:

{"customerid":1,"region":"EU","marketplaceid":4,"asin":["B000FC1PZC"]}
{"customerid":2,"region":"EU","marketplaceid":4,"asin":["B000FC1C9G"]}
这样生成的JSON文件是:

{"data":{"region":"EU","marketplaceid":4,"asin":["B000FC1PZC"],"customerid":1}}
{"data":{"region":"EU","marketplaceid":4,"asin":["B000FC1C9G"],"customerid":2}}

我可以建议您做以下几件事:1)在
创建表
命令中将
$somefield:int
转换为
“$somefield”:int
。2)尝试使用不同的JsonSerDe,例如,让我知道,如果这个助手中的任何一个不好,这是帖子中的一个打字错误($somefield:int),但实际上声明代码是好的。对于像{“\u fld1”这样的数据“:{fld1:“12345”},“fld2:“ABCD”}创建表时使用以下行格式SERDE'org.openx.data.jsonserde.jsonserde'和SERDEPROPERTIES(“mapping.dfld1”=“$fld1”),但是当我选择表字段dfld1时,它总是空的,我是否遗漏了什么。Thanksit使用您提供的表定义和数据对我来说很好,但我必须在backticks(`u fld1`)周围放置`u fld1`:hive>select*from temp;好的{“dfld1”:“12345”}ABCD是您正在使用的实际定义,还是只是简化了它?您使用的是什么版本的serde/hive/hadoop?这对我来说也很好:hive>select`_fld1`.dfld1 from temp;好的12345我对以$开头的字段名有问题,它总是返回null。我正在CDH5.5.0上使用Hive版本1.1.0和Hadoop 2.6.0。我想我正在使用最新的hive json serde,因为我最近下载了它。非常感谢您的帮助&time.ok,为了确保它是一个版本特定的问题,您可以获取以下文件:,它包含我使用的create.sql和data.txt。查看它们并运行hive-f create.sql(它将删除“temp”表并重新创建),然后告诉我它是否适合您。另外,serde的jar也应该有版本号,但我不知道它安装在您的系统中的什么地方。
{"customerid":1,"region":"EU","marketplaceid":4,"asin":["B000FC1PZC"]}
{"customerid":2,"region":"EU","marketplaceid":4,"asin":["B000FC1C9G"]}
{"data":{"region":"EU","marketplaceid":4,"asin":["B000FC1PZC"],"customerid":1}}
{"data":{"region":"EU","marketplaceid":4,"asin":["B000FC1C9G"],"customerid":2}}