elasticsearch,apache-spark,Hadoop,elasticsearch,Apache Spark" /> elasticsearch,apache-spark,Hadoop,elasticsearch,Apache Spark" />

Hadoop Spark在写入elasticsearch时不支持arraylist吗?

Hadoop Spark在写入elasticsearch时不支持arraylist吗?,hadoop,elasticsearch,apache-spark,Hadoop,elasticsearch,Apache Spark,我的结构如下: mylist = [{"key1":"val1"}, {"key2":"val2"}] myrdd = value_counts.map(lambda item: ('key', { 'field': somelist })) 我得到一个错误: 15/02/10 15:54:08 INFO scheduler.TaskSetManager:executor ip-10-80-15-145.ec2.internal:org.apache.spark.SparkExce

我的结构如下:

mylist = [{"key1":"val1"}, {"key2":"val2"}]
myrdd = value_counts.map(lambda item: ('key', { 
    'field': somelist 
}))
我得到一个错误: 15/02/10 15:54:08 INFO scheduler.TaskSetManager:executor ip-10-80-15-145.ec2.internal:org.apache.spark.SparkException(无法使用java.util.ArrayList类型的数据)[重复1]

rdd.saveAsNewAPIHadoopFile( 
            path='-', 
            outputFormatClass="org.elasticsearch.hadoop.mr.EsOutputFormat", 
            keyClass="org.apache.hadoop.io.NullWritable", 
            valueClass="org.elasticsearch.hadoop.mr.LinkedMapWritable", 
            conf={ 
        "es.nodes" : "localhost", 
        "es.port" : "9200", 
        "es.resource" : "mboyd/mboydtype" 
    }) 
当我将文档写入ES时,我希望文档的结尾是:

{
field:[{"key1":"val1"}, {"key2":"val2"}]
}

比赛有点晚了,但这是我们昨天遇到这个问题后提出的解决方案。将
'es.input.json':'true'
添加到配置文件中,然后对数据运行
json.dumps()

修改您的示例,如下所示:

import json

rdd = sc.parallelize([{"key1": ["val1", "val2"]}])
json_rdd = rdd.map(json.dumps)
json_rdd.saveAsNewAPIHadoopFile( 
    path='-', 
    outputFormatClass="org.elasticsearch.hadoop.mr.EsOutputFormat", 
    keyClass="org.apache.hadoop.io.NullWritable", 
    valueClass="org.elasticsearch.hadoop.mr.LinkedMapWritable", 
    conf={ 
        "es.nodes" : "localhost", 
        "es.port" : "9200", 
        "es.resource" : "mboyd/mboydtype",
        "es.input.json": "true"
    }
) 

刚遇到这个问题,解决方法是将所有列表转换为元组。
转换为json也是如此。

我觉得在其他答案中缺少一些要点,比如您必须从RDD返回一个2元组(我不知道为什么),并且还需要Elasticsearch hadoop jar文件才能工作。因此,我将写下我必须遵循的整个过程,以使其发挥作用

  • 下载Elasticsearch Hadoop jar文件。您可以从下载(最新版本在大多数情况下都可以使用-查看他们的更多信息)

  • 为演示创建一个文件
    run.py
    ,其中包含以下最小的代码段

    import json
    
    import pymongo_spark
    pymongo_spark.activate()
    
    from pyspark import SparkContext, SparkConf
    conf = SparkConf().setAppName('demo').setMaster('local')
    sc = SparkContext(conf=conf)
    
    rdd = sc.parallelize([{"key1": ["val1", "val2"]}])
    final_rdd = rdd.map(json.dumps).map(lambda x: ('key', x))
    
    final_rdd.saveAsNewAPIHadoopFile(
        path='-',
        outputFormatClass="org.elasticsearch.hadoop.mr.EsOutputFormat",
        keyClass="org.apache.hadoop.io.NullWritable",
        valueClass="org.elasticsearch.hadoop.mr.LinkedMapWritable",
        conf={
            "es.nodes" : "<server-ip>",
            "es.port" : "9200",
            "es.resource" : "index_name/doc_type_name",
            "es.input.json": "true"
        }
    )
    
    导入json
    进口pymongo_spark
    pymongo_spark.activate()
    从pyspark导入SparkContext,SparkConf
    conf=SparkConf().setAppName('demo').setMaster('local'))
    sc=SparkContext(conf=conf)
    rdd=sc.parallelize([{“key1”:[“val1”,“val2”]}])
    final_rdd=rdd.map(json.dumps.map)(lambda x:('key',x))
    final_rdd.saveasnewapiHadoop文件(
    路径='-',
    outputFormatClass=“org.elasticsearch.hadoop.mr.EsOutputFormat”,
    keyClass=“org.apache.hadoop.io.nullwriteable”,
    valueClass=“org.elasticsearch.hadoop.mr.LinkedMapWritable”,
    形态={
    “es.节点”:“,
    “es.端口”:“9200”,
    “es.resource”:“索引名称/文档类型名称”,
    “es.input.json”:“true”
    }
    )
    
  • 使用以下命令运行Spark作业
    /bin/Spark submit--jars/path/to/your/jar/file/elasticsearch-hadoop-5.6.4.jar--driver class path/path/to/you/jar/file/elasticsearch-hadoop-5.6.4.jar--master warn/path/to/your/Run/file/Run.py


  • 你试过地图吗?不过这会稍微改变你的结构。{“KE1”:{值〉:“Val1”……我不想要地图,我想要列表!我想你必须给图书馆所需的输入!!@ RoalDo请考虑接受这个问题,如果现在这个问题已经解决了。当转换为JSON时,我会遇到以下例外:“不能使用JavaUTI.HASMAP的RDD元素”您遇到过这个问题吗?我使用conf运行了相同的代码,并遇到了以下错误-“org.apache.spark.SparkException:无法使用java.lang.String类型的RDD元素”。我有什么地方做错了吗?我的ES在不同的服务器上,所以如果有什么不同的话,我会给出它的IP而不是本地主机。如果我想将列表保留为列表,有什么办法吗?请您提供更多关于“转换为json”的解释。你的意思与他/她的答案中所说明的@GBleaney相同吗?我没有测试他的代码,但是的,与另一个答案的逻辑相同。重点不是使用元组,而是使用列表。由于json将元组表示为列表,所以可以使用另一个答案,因此我也在验证它。@Karudoso谢谢。使用其他答案和我最终在其他一些博客上实现了它。我将我的整个过程作为另一个答案发布,以方便未来的用户()。下面是一些工作代码片段的汇编,这些代码片段将数据索引到Elasticsearch中-