我有一个ES集群,我想使用Spark从中提取所有会话ID(自定义字段),并将它们作为单列Dataframe写入某些Parquet文件中。
我创建了一个数据框,并想与take(1)
进行检查。该计划是:
= Physical Plan ==
CollectLimit 1
+- *Scan ElasticsearchRelation(Map(
es.net.http.auth.user -> app,
es.net.ssl.cert.allow.self.signed -> true,
es.query -> {"query": {"bool": {"filter": [{"range": {"eventTime": {"lt": "2017-12-01 00:00:00", "gte": "2019-05-15 00:00:00", "time_zone": "UTC", "format": "yyyy-MM-dd HH:mm:ss"}}}]}}},
es.net.http.auth.pass -> 123456,
es.read.field.include -> sessionId,
es.port -> 9200,
es.resource -> sessions/session,
es.nodes -> 192.168.150.12,
es.net.ssl -> true),
org.apache.spark.sql.SQLContext@121e4c9e,None) [sessionId#0] ReadSchema: struct<sessionId:string>
这始终使我的JVM崩溃。
但是,当我稍微修改日期范围时,它可以正常工作。即,将范围从2017/12/01
到2019/05/15
代替从2017/12/31
到2019/05/15
似乎很好。
由于我使用的是limit
子句,所以我认为日期范围应该无关紧要。尽管如此,我还是检查了该计划,以查看它是否有所改变:
= Physical Plan ==
CollectLimit 1
+- *Scan ElasticsearchRelation(Map(
es.net.http.auth.user -> app,
es.net.ssl.cert.allow.self.signed -> true,
es.query -> {"query": {"bool": {"filter": [{"range": {"eventTime": {"lt": "2017-12-31 00:00:00", "gte": "2019-05-15 00:00:00", "time_zone": "UTC", "format": "yyyy-MM-dd HH:mm:ss"}}}]}}},
es.net.http.auth.pass -> 123456,
es.read.field.include -> sessionId,
es.port -> 9200,
es.resource -> sessions/session,
es.nodes -> 192.168.150.12,
es.net.ssl -> true),
org.apache.spark.sql.SQLContext@121e4c9e,None) [sessionId#0] ReadSchema: struct<sessionId:string>
外观相同(更改日期)。
我希望没关系,但是我要补充一点,在其他时间范围(2017-12-01
至2017-12-31
)中的数据量与其余时间范围中的数据分布非常相似日期范围。我还想验证该特定范围内的数据没有问题,因此我还在2017-12-01
至2017-12-31
日期范围内进行了类似的查询,并且也成功了。
我在做什么错?在这种情况下(当我使用take(1)
时,为什么数据量会产生影响?
我正在使用PySpark,ElasticSearch 6和用于ES-spark(org.elasticsearch:elasticsearch-spark-20_2.11:6.7.2
)的最新驱动程序/连接器。