在spark scala中查找数组列中的元素的最好方法是什么?

我有一个数组列,我从中找到文本并形成一个数据框架。在以下2个选项中,哪种方法更好?选项1

val texts = Seq("text1", "text2", "text3")
 val df = mainDf.select(col("*"))
      .withColumn("temptext", explode($"textCol"))
      .where($"temptext".isin(texts: _*))

由于它增加了和额外的列 “temptext”,并通过爆炸增加重复的行。

  val tempDf = df.drop("temptext").dropDuplicates("Root.Id")  // dropDuplicates does not work since I have passed nested field

备选方案2

val df = mainDf.select(col("*"))
  .where(array_contains($"textCol", "text1") ||
      array_contains($"textCol", "text2") ||
      array_contains($"textCol", "text3"))

其实我想做一个通用的api,如果我选择方案2的话

那么问题是,对于每一个新的文本,我需要添加array_contains($”textCol”, “text4”),并且每次都要创建新的api。

而在选项1中,它会产生重复的行,因为我扩展了数组,并且还需要删除临时列。

解决方案:

使用 arrays_overlap (或) array_intersect 函数传递 array(<strings>) 而不是 array_contains.

Example:1.filter based on texts variable:

val df=Seq((Seq("text1")),(Seq("text4","text1")),(Seq("text5"))).
toDF("textCol")

df.show()
//+--------------+
//|       textCol|
//+--------------+
//|       [text1]|
//|[text4, text1]|
//|       [text5]|
//+--------------+

val texts = Array("text1","text2","text3")

//using arrays_overlap    
df.filter(arrays_overlap(col("textcol"),lit(texts))).show(false)
//+--------------+
//|textCol       |
//+--------------+
//|[text1]       |
//|[text4, text1]|
//+--------------+

//using arrays_intersect    
df.filter(size(array_intersect(col("textcol"),lit(texts))) > 0).show(false)
//+--------------+
//|textCol       |
//+--------------+
//|[text1]       |
//|[text4, text1]|
//+--------------+

2.Adding texts variable to the dataframe:

val texts = "text1,text2,text3"

val df=Seq((Seq("text1")),(Seq("text4","text1")),(Seq("text5"))).
toDF("textCol").
withColumn("texts",split(lit(s"${texts}"),","))

df.show(false)
//+--------------+---------------------+
//|textCol       |texts                |
//+--------------+---------------------+
//|[text1]       |[text1, text2, text3]|
//|[text4, text1]|[text1, text2, text3]|
//|[text5]       |[text1, text2, text3]|
//+--------------+---------------------+

//using array_intersect
df.filter("""size(array_intersect(textcol,texts)) > 0""").show(false)
//+--------------+---------------------+
//|textCol       |texts                |
//+--------------+---------------------+
//|[text1]       |[text1, text2, text3]|
//|[text4, text1]|[text1, text2, text3]|
//+--------------+---------------------+

//using arrays_overlap
df.filter("""arrays_overlap(textcol,texts)""").show(false)
+--------------+---------------------+
|textCol       |texts                |
+--------------+---------------------+
|[text1]       |[text1, text2, text3]|
|[text4, text1]|[text1, text2, text3]|
+--------------+---------------------+

给TA打赏
共{{data.count}}人
人已打赏
未分类

如何在不创建新的实例的情况下管好一个观测值。

2022-9-8 20:21:41

未分类

类型错误:parentSubmit不是一个函数。

2022-9-8 20:21:43

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索