我正在使用带有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多个记录。我需要如何更好地处理此问题的建议。 我正在考虑创建一个自定义过滤器,但是您对此有何看法(如果可以,请提供示例代码来实现此目的)。 感谢您的帮助。 谢谢。 问题答案: 你可以做到这一点, 如果返回一个值,则