使用 Pig-Hadoop 在 Elasticsearch 中获取包含文档的字段

Get fields with documents in Elasticsearch with Pig-Hadoop

我正在使用 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)

现在,由于每行中的数据不一致,我不知道哪些字段丢失了或哪些字段存在了。这证明了进一步处理的问题。

有什么方法可以获取字段值以及行或某种可以告诉我哪个值属于哪个字段的映射。诸如此类

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

经过进一步挖掘,找到了解决方案,如果有人找到,请张贴在这里以供参考。

您可以在将数据加载到 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;