当前位置: 首页 > 知识库问答 >
问题:

从火花DataFrame在elasticsearch中索引嵌套字段

许博
2023-03-14

假设我有一张这样的桌子:

field1 field2 field3 id
a0     a030   a040   0  
a0     a031   a041   0
a0     a032   a042   0
a1     a130   a040   1

它以拼花地板的形式存储。我需要在spark中读取表,在“field1”上执行groupBy,然后我需要在ES中存储一个嵌套字段(例如,称为“agg\u字段”),其中包含一个字典列表,其中包含字段2和字段3的值,这样文档将如下所示:

{
  "_id": "0"
  "field1" : "a0",
  "agg_fields" : [
    {
      "field2" : "a030",
      "field3" :  "a040"
    },
    {
      "field2" : "a031",
      "field3" :  "a041"
    },
    {
      "field2" : "a032",
      "field3" :  "a042"
    },
  ]
}
...

我可以阅读表格并进行分组:

df = sqlContext.read.parquet('some-table').groupBy('field1')

我可以做一些聚合并将结果发送给es:

df.withColumn(
    'aggregated', concat('field2', lit('|'), 'field3')
).agg(
    collect_set(aggregated)
).withColumnRenamed(
    'collect_set(aggregated)', 'agg_fields'
).write.format(
    'org.elasticsearch.spark.sql'
).mode(
    'append'
 ).option(
    'es.mapping.id', 'id'
).options(
    **es_config
).option(
    'es.resource', my_resource
).save()

但我不知道如何将聚合更改为嵌套的“agg\u fields”列,该列将被elasticsearch解释为嵌套字段。我该怎么做?

共有1个答案

卞俊贤
2023-03-14
df = spark.read.load('file:///path/to/your/example.json', format='json')
df = df.withColumn('agg_fields', f.explode(df['agg_fields']))
df = df.groupBy(df['field1']).agg(f.collect_set(f.concat_ws('|', df['agg_fields']['field2'], df['agg_fields']['field3'])).alias('agg_fields'))

输出:

+------+---------------------------------+                                      
|field1|agg_fields                       |
+------+---------------------------------+
|a0    |[a030|a040, a032|a042, a031|a041]|
+------+---------------------------------+

你是说这个吗?

 类似资料:
  • 问题内容: 我对ES还是相当陌生,并正在将其用于我的新项目。首先,我为客户提供了一个简单的映射,其中包含名字和姓氏以及付款信息对象列表。如果我在SQL中执行此操作,那将类似于客户表和具有1:许多关系的付款信息表。 这是我要执行的操作的一个简单示例:https : //gist.github.com/anonymous/6109593 我希望根据payInfos嵌套数组中的任何匹配项找到任何客户,即

  • 问题内容: 我正在使用Java API对Elasticsearch进行CRUD操作。 我有一个带有嵌套字段的类型,我想更新此字段。 这是我对类型的映射: 当然,我的最终用户类型将具有其他参数。 现在,我想将此文档添加到我的嵌套字段中: 我在文档中搜索有关如何更新嵌套文档的信息,但找不到任何东西。例如,我在字符串中具有先前的JSON对象(我们将此字符串称为json)。我尝试了以下代码,但似乎无法正常

  • 我试图通过使用术语筛选查找加入2个弹性搜索索引。我查阅了http://www.elasticsearch.org/blog/terms-filter-lookup/和http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/query-dsl-terms-filter.html。这些示例查找像“followers”这

  • 问题内容: 我有一个包含嵌套对象的文档,如下所示: 现在,我需要按书名(不是book_title)和年份(比如2014)来过滤书籍。我需要的输出将是: 当我使用嵌套过滤器时,即使它们不匹配,我也会得到所有嵌套对象。如何仅获取匹配的嵌套对象? 问题答案: 您需要使用以下嵌套功能。 在输出中,您将确切地获得期望的结果,即字段和嵌套数组中的匹配书。

  • Sup社区。我有个问题。我正在使用Elasticsearch 6.4 我的数据结构的一部分: 我需要得到按成本排序的文档desc,我需要排序dirs字段中的值date_by字段与nulls-first。 如何对嵌套字段内的值进行排序,而不按此嵌套字段对文档进行排序?

  • 我使用Spring-Data-ElasticSearch2.0.8和ElasticSearch.2.2.0来动态搜索嵌套对象。 基本上,我的嵌套对象可以有很少的嵌套字段,但我希望在所有这些字段中动态搜索。例如,一个动物文档可以有3x个字段来描述它:名称/大小/描述。 我想在所有这些搜索,因为我的搜索结束点只是有一个‘描述’自由文本选项。因此,当用户在他的入口点键入'15'或'dog'时,搜索将检查