使用pig hadoop在elasticsearch中获取包含文档的字段

tez616oj  于 2021-06-21  发布在  Pig
关注(0)|答案(1)|浏览(341)

我正在使用pig hadoop从elasticsearch服务器读取文档。文件看起来像这样

{
    "_index": "sa-test",
    "_type": "logs",
    "_id": "AUujDbzSR5FzDDhtC1LH",
    "_score": 1,
    "_source": {
        "fieldA": "....",
        "fieldB": "....",
        "fieldC": ".....",
        "fieldE": "....."
    }
}, {
    "_index": "sa-test",
    "_type": "logs",
    "_id": "AUujDbzSR5FzXXXtC1LH",
    "_score": 1,
    "_source": {
        "fieldB": "....",
        "fieldC": ".....",
        "fieldD": "....."
    }
}

这很好。当我试图通过pig读取这些数据时,问题就出现了

-- load the data in
raw_logs = LOAD 'sa-test' USING org.elasticsearch.hadoop.pig.EsStorage('es.query=?q=someFilter', 'es.mapping.date.rich=false');
-- for now just dump it
DUMP raw_logs;

这将生成表单中的数据

(fieldA,fieldB,fieldC,fieldE)
(fieldB,fieldC,fieldD)

现在,我不知道哪些字段丢失了,哪些字段存在,因为每行中的数据不一致。这是一个有待进一步处理的问题。
有什么方法可以得到字段值以及行或某种Map,可以告诉我哪个值属于哪个字段。类似的东西

(A=fieldA,B=fieldB,C=fieldC,E=fieldE)
(A=fieldB,C=fieldC,D=fieldD)
pgky5nke

pgky5nke1#

经过进一步的挖掘,找到了解决办法,如果有人发现,就贴在这里供参考。
将数据加载到pig时,可以指定架构:

raw_logs = LOAD 'sa-test' USING org.elasticsearch.hadoop.pig.EsStorage('es.query=?q=someFilter', 'es.mapping.date.rich=false') AS (fieldA:...,fieldB:...,fieldC:...,fieldD:...fieldE:...);

es-hadoop将把elasticsearch中的文档字段与提供的pig模式匹配起来。此时,您可以按名称引用字段:

all_fieldA_values = FOREACH raw_logs GENERATE fieldA;

相关问题