Pyspark读取Elasticsearch索引返回空对象列表问题咨询
问题根因
你遇到的嵌套数组内对象为空的问题,是ES-Spark连接器的字段读取规则导致的:你在es.read.field.include中仅指定到features.hashtags层级,连接器不会自动递归读取数组内部的text、count子字段,因此只会返回空的对象壳。
解决方案
你可以选择以下任意一种方式修改读取配置:
- 显式声明嵌套数组内的所有需要读取的子字段
修改es.read.field.include配置,将数组内部的子字段完整加入白名单,修改后的完整代码如下:
tweets = sqlContext.read.format("org.elasticsearch.spark.sql") \ .option("es.nodes", "localhost") \ .option("es.port", "9200") \ .option("es.read.field.as.array.include", "features.hashtags")\ .option("es.read.field.include", "user_id, features.hashtags.text, features.hashtags.count")\ .option("es.resource", "twitter")\ .load().limit(10)
- 移除字段白名单限制
如果你需要读取索引内的全部字段,不需要做字段过滤,直接删除es.read.field.include配置项即可,连接器会自动根据ES索引的Mapping解析所有嵌套字段。 - 补充嵌套字段读取开关(可选)
如果调整上述配置后问题仍存在,可以额外添加嵌套字段读取开启配置:
.option("es.read.nested.fields.enabled", "true")
验证方法
修改配置后先打印DataFrame的Schema确认结构:
tweets.printSchema()
正常情况下可以看到features.hashtags为Array类型,内部包含text、count两个子字段,再调用show()即可看到完整的嵌套数据。
内容的提问来源于stack exchange,提问作者mohsen mortezapour
相关产品推荐
相关产品推荐

