使用PySpark我正在尝试从elasticsearch读取数据。通常,我会将查询设置为沿线的内容(请参见下面的查询),并将es.resource设置为诸如“ my_index / doc”之类的索引,并且能够将数据读取到spark中:
q ="""{
"query": {
"match_all": {}
}
}"""
但是,最近我在kibana和JDBC与其他SQL客户端一起尝试了_xpack / sql,它们在获取数据方面非常有效。但是,当我尝试在pyspark代码中引用_xpack时,出现以下错误:
Py4JJavaError: An error occurred while calling
z:org.apache.spark.api.python.PythonRDD.newAPIHadoopRDD.
: org.elasticsearch.hadoop.rest.EsHadoopInvalidRequest:
org.elasticsearch.hadoop.rest.EsHadoopRemoteException:
invalid_index_name_exception: Invalid index name [_xpack], must not start with '_'.
null
有人尝试过使用_xpack还是知道如何从Elasticsearch hadoop插件执行Elasticsearch SQL查询?
在下面,您将找到我想用于在pyspark上执行的代码摘录!
q = """{"query": "select * from eg_flight limit 1"}"""
es_read_conf = {
"es.nodes" : "192.168.1.71,192.168.1.72,192.168.1.73",
"es.port" : "9200",
"es.resource" : "_xpack/sql",
"es.query" : q
}
es_rdd = sc.newAPIHadoopRDD(
inputFormatClass="org.elasticsearch.hadoop.mr.EsInputFormat",
keyClass="org.apache.hadoop.io.NullWritable",
valueClass="org.elasticsearch.hadoop.mr.LinkedMapWritable",
conf=es_read_conf)
答案 0 :(得分:0)
我认为不支持此功能。 PySpark中的另一种解决方案是使用JDBC驱动程序,我曾尝试过。我尝试了以下方法:
es_df = spark.read.jdbc(url="jdbc:es://http://192.168.1.71:9200", table = "(select * from eg_flight) mytable")
我收到以下错误:
Py4JJavaError: An error occurred while calling o2488.jdbc.
: java.sql.SQLFeatureNotSupportedException: Found 1 problem(s)
line 1:8: Unexecutable item
...
一种替代方法是使用核心Python并以此进行请求,但我不建议将其用于大型数据集。
import requests as r
import json
es_template = {
"query": "select * from eg_flight"
}
es_link = "http://192.168.1.71:9200/_xpack/sql"
headers = {'Content-type': 'application/json'}
if __name__ == "__main__":
load = r.post(es_link, data=json.dumps(es_template), headers=headers)
if load.status_code == 200:
load = load.json()
#do something with it