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

仅知道筛选条件时,泛型数据泛型数组上的火花筛选

汪正雅
2023-03-14

我想过滤Spark sql。DataFrame只留下想要的数组元素,而不知道整个模式(不要硬编码)。模式:

root
 |-- callstartcelllabel: string (nullable = true)
 |-- calltargetcelllabel: string (nullable = true)
 |-- measurements: array (nullable = true)
 |    |-- element: struct (containsNull = true)
 |    |    |-- enodeb: string (nullable = true)
 |    |    |-- label: string (nullable = true)
 |    |    |-- ltecelloid: long (nullable = true)
 |-- networkcode: long (nullable = true)
 |-- ocode: long (nullable = true)
 |-- startcelllabel: string (nullable = true)
 |-- startcelloid: long (nullable = true)
 |-- targetcelllabel: string (nullable = true)
 |-- targetcelloid: long (nullable = true)
 |-- timestamp: long (nullable = true)

我希望整个根只包含特定的测量值(已过滤),并且根必须在过滤后至少包含一个。

我有这个根的数据帧,我有一个过滤值的数据帧(一列)。

所以,例如:我只知道我的根包含测量数组,而该数组包含标签。所以我想要包含标签(“label1”、“label2”)的整个根和整个测量值。

最后一次使用爆炸和collect_list会导致:分组表达式序列为空,并且“call start cell tag”不是聚合函数…甚至有可能推广这样的过滤案例吗?还不知道这种通用udaf应该是什么样子。

新火花。

编辑:

我得出的当前解决方案是:

分解数组-

使用udf会更快吗?我不知道如何制作一个通用udf过滤通用数组,只知道过滤值。。。

共有2个答案

浦德明
2023-03-14
 import org.apache.spark.sql.Row
 import org.apache.spark.sql.functions.udf
var df=Seq((1,2,Array(Test(1,2),Test(5,6))),(1,3,Array(Test(1,2),Test(5,3))),(10,11,Array(Test(1,6)))).toDF("name","rank","array")
 df.show
+----+----+----------------+
|name|rank|           array|
+----+----+----------------+
|   1|   2|[[1, 2], [5, 6]]|
|   1|   3|[[1, 2], [5, 3]]|
|  10|  11|        [[1, 6]]|
+----+----+----------------+
def test={
   udf((a:scala.collection.mutable.WrappedArray[Row])=> {
   val b=a.toArray.map(x=>(x.getInt(0),x.getInt(1)))
   b.filter(y=>y._1>1)
   })}
 df.withColumn("array",test(df("array"))).show
+----+----+--------+
|name|rank|   array|
+----+----+--------+
|   1|   2|[[5, 6]]|
|   1|   3|[[5, 3]]|
|  10|  11|      []|
+----+----+--------+
陆文博
2023-03-14
case class Test(a:Int,b:Int) // declared case class to show above scenario
var df=List((1,2,Test(1,2)),(2,3,Test(3,4)),(4,2,Test(5,6))).toDF("name","rank","array")
 +----+----+------+
 |name|rank| array|
 +----+----+------+
 |   1|   2|[1, 2]|
 |   2|   3|[3, 4]|
 |   4|   2|[5, 6]|
 +----+----+------+
df.printSchema
 //dataFrame structure look like this 
 root
|-- name: integer (nullable = false)
|-- rank: integer (nullable = false)
|-- array: struct (nullable = true)
|    |-- a: integer (nullable = false)
|    |-- b: integer (nullable = false)

df.filter(df("array")("a")>1).show
//after filter on dataFrame on specified condition
 +----+----+------+
 |name|rank| array|
 +----+----+------+
 |   2|   3|[3, 4]|
 |   4|   2|[5, 6]|
 +----+----+------+

//Above code help you to understand the Scenario

//use this piece of code:
 df.filter(df("measurements")("label")==="label1" || df("measurements")("label")==="label2).show
 类似资料:
  • 基本上,我希望使用过滤泛型(扩展集合),然后返回相同泛型集合实现的实例(最好是新实例),例如实现方法签名。 null null null 修改原始列表

  • 我正在尝试有这样的方法签名:public static List FilterList(List collection,String FilterString,String Property=“”) 这样,我可以从任何地方调用这个方法,并传递给它任何列表,它将返回给我一个过滤的列表。

  • 问题内容: 我的任务是用Java编写哈希表,该哈希表必须适用于任何数据类型。我正在编写的代码规则如下:-哈希表必须具有一个数组作为基础数据结构,其大小在构造对象时确定- 发生冲突时,应该放置碰撞的元素链接列表,该列表包含哈希表中该索引(键)处的所有元素 因此,对于基础数据类型,我做了一个LinkedList类型的数组(自定义,不是Java API LinkedList)。 当然,问题是实例化此数组

  • 问题内容: 因此,我正在开发这个通用的HashTable类,并且希望将其通用地用于任何数量的传入类型,并且我还想将内部存储数组初始化为LinkedList的数组(出于冲突目的),其中为确保类型安全,每个LinkedList都被预先指定为HashTable类中的泛型类型。我该怎么做?以下代码最能阐明我的意图,但当然不会编译。 问题答案: Java中的泛型不允许创建具有泛型类型的数组。您可以将数组转换

  • 首先我创建一个管理员用户和两个模型 之后,我手动将我的管理员用户分配给两个TCU。 第一个Tcu有三个位置数据: 第二个Tcu有两个位置数据: 之后,我创建一个视图,以获得两个TCU的最后位置。 结果是我只得到第二个TCU的最后一个位置: 如何从第一个和第二个TCU获取最后一个位置?

  • 问题内容: 我正在尝试创建一个泛型类型的数组。我收到错误消息: 我很困惑。任何线索为什么会这样。 问题答案: 其背后的原因是,您不能创建通用或参数化类型的数组,而只能 创建可验证的 类型(即可以在运行时推断出的类型)。 尽管可以将此类数组类型 声明 为变量或方法参数。这有点不合逻辑,但这就是Java的样子。 Java泛型和集合在第6章中广泛讨论了此问题和相关问题。