Apache pig 从ES加载数据,并使用pig将其存储为HDFS中的avro

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';。稍后,在配置单元上定义一个外部表,我可以查询这些数据。这是工作正常的完整示例(我从代码中删除了所

我有一些关于ElasticSearch的数据需要通过HDFS发送。我正在尝试使用pig(这是我第一次使用它),但在为数据定义正确的模式时遇到了一些问题

首先,我尝试使用带有
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
  } ]
}
');