当前位置: 首页 > 面试题库 >

在Spark DataFrame中按数组值过滤

祝昊东
2023-03-14
问题内容

我正在使用带有Elasticsearch的Apache Spark 1.5数据帧,我尝试从包含ID列表(数组)的列中过滤ID。

例如,elasticsearch列的映射如下所示:

    {
        "people":{
            "properties":{
                "artist":{
                   "properties":{
                      "id":{
                         "index":"not_analyzed",
                         "type":"string"
                       },
                       "name":{
                          "type":"string",
                          "index":"not_analyzed",
                       }
                   }
               }
          }
    }

示例数据格式如下

{
    "people": {
        "artist": {
            [
                  {
                       "id": "153",
                       "name": "Tom"
                  },
                  {
                       "id": "15389",
                       "name": "Cok"
                  }
            ]
        }
    }
},
{
    "people": {
        "artist": {
            [
                  {
                       "id": "369",
                       "name": "Carl"
                  },
                  {
                       "id": "15389",
                       "name": "Cok"
                  },
                 {
                       "id": "698",
                       "name": "Sol"
                  }
            ]
        }
    }
}

在火花我尝试这样做:

val peopleId  = 152
val dataFrame = sqlContext.read
     .format("org.elasticsearch.spark.sql")
     .load("index/type")

dataFrame.filter(dataFrame("people.artist.id").contains(peopleId))
    .select("people_sequence.artist.id")

我得到了包含152的所有id,例如1523,152978,但不仅id == 152

然后我尝试

dataFrame.filter(dataFrame("people.artist.id").equalTo(peopleId))
    .select("people.artist.id")

我变得空虚,我明白为什么,这是因为我有很多人。artist.id

有人可以告诉我如何在有ID列表时进行过滤吗?


问题答案:

在Spark 1.5+中,您可以使用array_contains功能:

df.where(array_contains($"people.artist.id", "153"))

如果您使用的是较早版本,则可以尝试这样的UDF:

val containsId = udf(
  (rs: Seq[Row], v: String) => rs.map(_.getAs[String]("id")).exists(_ == v))
df.where(containsId($"people.artist", lit("153")))


 类似资料:
  • 问题内容: 我将如何创建一个按值过滤二维数组的函数? 给定以下数组: 我将如何过滤数组以仅显示键中包含特定值的那些数组?例如。 结果输出为: 编辑 我忘了提及搜索值应该是可互换的-即或。 问题答案: 将PHP的array_filter)函数与回调一起使用。 编辑:如果需要可互换,则可以稍微修改代码:

  • 问题内容: 我试图制作一个数组的独立副本,但无法获得一个。出于效率原因,我无法使用for循环将其逐个整数复制。还有其他办法吗?这是我的代码: 问题答案: 看方法。喜欢,

  • 我尝试过滤,以获得值从订阅号内*...ou.subscriber具有扩展的dinfo[SOURCE_OR_TARGET=="目标"],但我的jsonpath它不工作。 我尝试的jsonpath: 结果,我想得到这个subscriberNumber=“001” JSON: 谢谢你的帮助。

  • 我有以下文件: 第一份文件: 第二份文件: 我知道如果我想按产品名称分组,我可以使用聚合 这将给我两个桶,两个不同的键“product1”,“product2”。 但是,如果我想按标记键分组,查询应该是什么?i、 e.我想按name==key1的标记分组,然后我希望有一个key=“value1”的bucket;而如果我按name==key2的标记分组,我希望结果是两个bucket,其键为“valu

  • 我有一个循环来读取数据,但编号不是连续的。因此,我想跳过特定的值。但我只知道如何跳过一个,而不是一组值。这是我的示例代码: 但是我需要的不是“x!=9”,而是像“如果x!=其中一个值[9,10,12,16,…](编辑:这些值存储在列表中)。有什么建议吗?

  • 问题内容: 我有一个数组模型如下: 现在我有了一个Empid的数组。 所以现在我需要过滤第一个包含第二个中所有键的数组。 输出: 我可以使用循环进行此操作,但是由于我的模型对象中有100多个记录。我需要如何更好地处理此问题的建议。 我正在考虑创建一个自定义过滤器,但是您对此有何看法(如果可以,请提供示例代码来实现此目的)。 感谢您的帮助。 谢谢。 问题答案: 你可以做到这一点, 如果返回一个值,则