如何在 Spark Scala 数据框中拆分逗号分隔的字符串并获取 n 个值?

Posted

技术标签:

【中文标题】如何在 Spark Scala 数据框中拆分逗号分隔的字符串并获取 n 个值?【英文标题】:How to split comma separated string and get n values in Spark Scala dataframe? 【发布时间】:2017-07-13 17:06:13 【问题描述】:

如何从 Spark Scala 中的 arraytype 列中仅获取 2 个数据? 我得到了val df = spark.sqlContext.sql("select col1, col2 from test_tbl")之类的数据。

我有如下数据:

col1  | col2                              
---   | ---
a     | [test1,test2,test3,test4,.....]   
b     | [a1,a2,a3,a4,a5,.....]       

我想获取如下数据:

col1| col2
----|----
a   | test1,test2
b   | a1,a2

当我在做df.withColumn("test", col("col2").take(5)) 时,它不起作用。它给出了这个错误:

取值不是 org.apache.spark.sql.ColumnName 的成员

如何按上述顺序获取数据?

【问题讨论】:

“不工作”是什么意思?你有错误吗?会发生什么? 它给出错误:取值不是 org.apache.spark.sql.ColumnName 的成员 【参考方案1】:

withColumn 内部,您可以调用 udf getPartialstring,因为您可以使用slicetake 方法,如下所示示例 sn-p 未经测试。

  import sqlContext.implicits._
  import org.apache.spark.sql.functions._

  val getPartialstring = udf((array : Seq[String], fromIndex : Int, toIndex : Int) 
   => array.slice(fromIndex ,toIndex ).mkString(",")) 

你的来电者看起来像

 df.withColumn("test",getPartialstring(col("col2"))

col("col2").take(5) 失败是因为 column 没有方法 take(..) 这就是您的错误消息显示的原因

错误:取值不是 org.apache.spark.sql.ColumnName 的成员

您可以使用 udf 方法来解决这个问题。

【讨论】:

这也有效,我无法接受答案。我想我还是新手:),请原谅我【参考方案2】:

您可以使用数组 Column 的 apply 函数将每个单独的项目获取到某个索引,然后使用 array 函数构建一个新数组:

import spark.implicits._
import org.apache.spark.sql.functions._

// Sample data:
val df = Seq(
  ("a", Array("a1", "a2", "a3", "a4", "a5", "a6")),
  ("a", Array("b1", "b2", "b3", "b4", "b5")),
  ("c", Array("c1", "c2"))
).toDF("col1", "col2")

val n = 4
val result = df.withColumn("col2", array((0 until n).map($"col2"(_)): _*))

result.show(false)
// +----+--------------------+
// |col1|col2                |
// +----+--------------------+
// |a   |[a1, a2, a3, a4]    |
// |a   |[b1, b2, b3, b4]    |
// |c   |[c1, c2, null, null]|
// +----+--------------------+

请注意,对于数组小于n 的记录,这将“填充”结果为nulls。

【讨论】:

谢谢它工作正常,我现在不能给你点并接受我会稍后再做

以上是关于如何在 Spark Scala 数据框中拆分逗号分隔的字符串并获取 n 个值?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Scala/Spark 的数据框中扩展数组 [重复]

如何在 Scala/Spark 中为数据框中的每一行编写一个 Json 文件并重命名文件

如何在spark scala数据框中更新嵌套列的xml值

如何访问存储在scala spark中的数据框中的映射值和键

如何使用 Scala/Spark 添加不基于数据框中现有列的新列? [复制]

Spark Scala,如何检查数据框中是不是存在嵌套列