apache pig—从es加载数据,并使用pig作为avro存储在hdfs中

pwuypxnk  于 2021-06-24  发布在  Pig
关注(0)|答案(1)|浏览(460)

我有一些关于elasticsearch的数据需要通过hdfs发送。我正在尝试使用pig(这是我第一次使用它),但是在为数据定义正确的模式时遇到了一些问题。
首先,我尝试使用 'es.output.json=true'org.elasticsearch.hadoop.pig.EsStorage ,我可以正确地加载/转储数据,还可以使用 STORE A INTO 'hdfs://path/to/store'; . 稍后,在配置单元上定义一个外部表,我可以查询这个数据。这是一个运行良好的完整示例(我从代码中删除了所有ssl属性):

REGISTER /path/to/commons-httpclient-3.1.jar;
REGISTER /path/to/elasticsearch-hadoop-5.3.0.jar;

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.output.json=true');

STORE A INTO 'hdfs://path/to/store';

如何将数据存储为avro到hdfs?我想我需要使用 AvroStorage ,但我也应该定义一个加载数据的模式,否则json就足够了?我试着用 LOAD...USING...AS 命令和设置 es.mapping.date.rich=false 而不是 es.output.json=true (我的数据非常复杂,有MapMap之类的东西),但它不起作用。我不确定问题是在语法上,还是在方法本身。如果能给你一个正确方向的提示就好了。
更新
这是我尝试的一个例子 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
  } ]
}
');
egdjgwm8

egdjgwm81#

为了将来的读者,我决定使用 spark 相反,因为它比 pig . 保存 avro hdfs上的文件,我正在使用 databrick 图书馆。

相关问题