Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/hadoop/6.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.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
Hadoop Elastic Map Reduce JSON导出到DynamoDB错误AttributeValue不能包含空字符串_Hadoop_Hive_Amazon Dynamodb_Amazon Emr - Fatal编程技术网

Hadoop Elastic Map Reduce JSON导出到DynamoDB错误AttributeValue不能包含空字符串

Hadoop Elastic Map Reduce JSON导出到DynamoDB错误AttributeValue不能包含空字符串,hadoop,hive,amazon-dynamodb,amazon-emr,Hadoop,Hive,Amazon Dynamodb,Amazon Emr,我正在尝试使用EMR作业从S3中包含稀疏字段的JSON文件导入数据,例如,ios_os字段和android_os,但只有一个包含数据。有时数据为null,有时为空字符串,当尝试插入到DynamoDB时,我会收到一个错误(尽管我能够插入一些填充稀疏的记录): “AttributeValue不能包含空字符串” {“created_at_timestamp”:1358122714,…,data:null,type:“e”,“android_网络运营商”:“”} 我筛选出了包含空字符串“”的列,但仍会出

我正在尝试使用EMR作业从S3中包含稀疏字段的JSON文件导入数据,例如,ios_os字段和android_os,但只有一个包含数据。有时数据为null,有时为空字符串,当尝试插入到DynamoDB时,我会收到一个错误(尽管我能够插入一些填充稀疏的记录):

“AttributeValue不能包含空字符串” {“created_at_timestamp”:1358122714,…,data:null,type:“e”,“android_网络运营商”:“”}

我筛选出了包含空字符串“”的列,但仍会出现该错误。我假设是“属性”:null值导致了这一点(或两者都有)。我假设,为了让它正常工作,这些值在进入DynamoDB时不应该存在

有没有办法通过JSONSerde或配置单元与DynamoDB表的交互来告诉配置单元忽略空字符串属性值

以下是配置单元SQL架构和insert命令的示例:

CREATE EXTERNAL TABLE IF NOT EXISTS json_events (
  -- Common
  created_at BIGINT,
  data STRING,
  type STRING,
  android_network_carrier STRING
)
PARTITIONED BY (created_at BIGINT, type STRING)
ROW FORMAT SERDE "org.apache.hadoop.hive.contrib.serde2.JsonSerde"
WITH SERDEPROPERTIES (
  -- Common
  "created_at"="$.created_at",
  "data"="$.data",
  "android_network_carrier"="$.anw",
  "type"="$.dt"
)
LOCATION s3://test.data/json_events;

CREATE EXTERNAL TABLE IF NOT EXISTS dynamo_events (
  -- Common
  created_at BIGINT,
  data STRING,
  type STRING,
  android_network_carrier STRING
)
STORED BY 'org.apache.hadoop.hive.dynamodb.DynamoDBStorageHandler' 
TBLPROPERTIES ("dynamodb.table.name" = "test-events", 
"dynamodb.column.mapping" = "created_at:created_at,data:data,type:type,android_network_carrier:android_network_carrier"); 
ALTER TABLE json_events RECOVER PARTITIONS;

INSERT OVERWRITE TABLE dynamo_events
SELECT created_at,
  data,
  android_network_carrier,
  type
FROM json_events 
WHERE created_at = 20130114 AND type = 'e';

只要不是主键,
null
s就不应该是问题

但是,DynamoDB不允许使用中所述的空字符串或空集

要解决这个问题,我认为您有两个选择:

  • 为空字符串(如“n/a”)定义一个常量,并确保数据提取过程将丢失的值视为一个常量
  • 您也可以过滤这些记录,但这将意味着丢失数据。可以这样做:

    INSERT OVERWRITE TABLE dynamo_events
    SELECT created_at,
      data,
      android_network_carrier,
      type
    FROM json_events 
    WHERE created_at = 20130114 AND type = 'e' AND android_network_carrier != "";
    

  • 您可以共享表定义和查询吗?我想我知道它是什么,但需要看看您正在尝试做什么。我添加了一个示例配置单元SQL模式和insert语句,它应该表示我正在尝试做的事情。