Apache pig 从ES加载数据,并使用pig将其存储为HDFS中的avro
我有一些关于ElasticSearch的数据需要通过HDFS发送。我正在尝试使用pig(这是我第一次使用它),但在为数据定义正确的模式时遇到了一些问题 首先,我尝试使用带有Apache pig 从ES加载数据,并使用pig将其存储为HDFS中的avro,apache-pig,apache-pig-grunt,Apache Pig,Apache Pig Grunt,我有一些关于ElasticSearch的数据需要通过HDFS发送。我正在尝试使用pig(这是我第一次使用它),但在为数据定义正确的模式时遇到了一些问题 首先,我尝试使用带有org.elasticsearch.hadoop.pig.EsStorage的选项'es.output.JSON=true'加载JSON,我可以正确加载/转储数据,还可以使用将数据存储到hdfs://path/to/store';。稍后,在配置单元上定义一个外部表,我可以查询这些数据。这是工作正常的完整示例(我从代码中删除了所
org.elasticsearch.hadoop.pig.EsStorage
的选项'es.output.JSON=true'
加载JSON,我可以正确加载/转储数据,还可以使用将数据存储到hdfs://path/to/store';代码>。稍后,在配置单元上定义一个外部表,我可以查询这些数据。这是工作正常的完整示例(我从代码中删除了所有SSL属性):
如何将数据存储为AVRO到HDFS?我想我需要使用AvroStorage
,但是我还应该定义一个加载数据的模式,或者JSON就足够了?我试图用LOAD…定义一个模式,使用…AS
命令并设置es.mapping.date.rich=false
,而不是es.output.json=true
(我的数据非常复杂,有地图之类的东西),但它不起作用。我不确定问题是在语法上,还是在方法本身上。如果有一个正确方向的提示就好了
更新
这是我用es.mapping.date.rich=false尝试的一个例子。我的问题是,如果一个字段为空,那么所有字段的顺序都会错误
A = LOAD 'my-index/log' USING org.elasticsearch.hadoop.pig.EsStorage(
'es.nodes=https://addr1:port,https://addr2:port2,https://addr3:port3',
'es.query=?q=*',
'es.mapping.date.rich=false')
AS(
field1:chararray,
field2:chararray,
field3:map[chararray,fieldMap:map[],chararray],
field4:chararray,
field5:map[]
);
B = FOREACH A GENERATE field1, field2;
STORE B INTO 'hdfs://path/to/store' USING AvroStorage('
{
"type" : "foo1",
"name" : "foo2",
"namespace" : "foo3",
"fields" : [ {
"name" : "field1",
"type" : ["null","string"],
"default" : null
}, {
"name" : "field2",
"type" : ["null","string"],
"default" : null
} ]
}
');
对于未来的读者,我决定改用spark
,因为它比pig
快得多。要在hdfs上保存avro
文件,我使用databrick
库
A = LOAD 'my-index/log' USING org.elasticsearch.hadoop.pig.EsStorage(
'es.nodes=https://addr1:port,https://addr2:port2,https://addr3:port3',
'es.query=?q=*',
'es.mapping.date.rich=false')
AS(
field1:chararray,
field2:chararray,
field3:map[chararray,fieldMap:map[],chararray],
field4:chararray,
field5:map[]
);
B = FOREACH A GENERATE field1, field2;
STORE B INTO 'hdfs://path/to/store' USING AvroStorage('
{
"type" : "foo1",
"name" : "foo2",
"namespace" : "foo3",
"fields" : [ {
"name" : "field1",
"type" : ["null","string"],
"default" : null
}, {
"name" : "field2",
"type" : ["null","string"],
"default" : null
} ]
}
');