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中-