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 - 它是如何工作的的主要内容,如果未能解决你的问题,请参考以下文章

Spark 中 Distinct() 函数是如何工作的?

如何在 Spark 中加速 leftouterjoin?

任务如何在 spark 引擎(称为 DAG)中执行?

spark工作原理

apache spark中的sortbykey

如何将控制栏添加到标题栏正下方的 Flex Spark 面板组件