Spark LuceneRDD - 它是如何工作的
Posted
技术标签:
【中文标题】Spark LuceneRDD - 它是如何工作的【英文标题】:Spark LuceneRDD - how does it work 【发布时间】:2017-05-31 10:21:55 【问题描述】:你能帮我弄清楚初始化Spark RDD时会发生什么吗?
有官方例子here:
val capitals = spark.read.parquet("capitals.parquet").select("name", "country")
val luceneRDD = LuceneRDD(capitals)
val result = luceneRDD.termQuery("name", "ottawa", 10)
但是我不熟悉 Scala,并且在阅读源代码时遇到了麻烦。能否请您回答下一个问题:
-
spark-lucenerdd 如何索引
capitals.parquet
?如何索引每列的每一行(所有值)?
我可以为luceneRDD
设置分区数吗?
【问题讨论】:
@Zouzias 你能看看这个问题吗? (1) 索引是多字段的,即对“名称”和“国家”字段进行索引。换句话说,您可以在索引后对两个(或每个)字段执行查询。如果您只想为一个字段编制索引,请仅选择一个。 (2) 是否要设置LuceneRDD
的分区数,可以在输入的RDD/DataFrame/Dataset上设置,即val luceneRDD = LuceneRDD(capitals.repartition(10))
为10个分区。
【参考方案1】:
(免责声明:我是LuceneRDD的作者)
看看我准备的幻灯片:
https://www.slideshare.net/zouzias/lucenerdd-for-geospatial-search-and-entity-linkage
简而言之,LuceneRDD 在每个 Spark 执行器上实例化一个倒排索引,并将来自 Spark 执行器的搜索结果收集/聚合到 Spark 驱动程序。 LuceneRDD 背后的主要动机是通过全文搜索、地理空间搜索和实体链接在本地扩展 Spark 的功能,而无需外部依赖 SolrCloud 或 Elasticsearch 集群。
回答您的问题:
-
默认情况下,您的 DataFrame 的所有列都被索引。
您可以通过对输入 DataFrame 重新分区来设置分区数,即,
LuceneRDD(capitals.repartition(numPartitions=10))
【讨论】:
以上是关于Spark LuceneRDD - 它是如何工作的的主要内容,如果未能解决你的问题,请参考以下文章