如何在 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
,因为您可以使用slice
或take
方法,如下所示示例 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
的记录,这将“填充”结果为null
s。
【讨论】:
谢谢它工作正常,我现在不能给你点并接受我会稍后再做以上是关于如何在 Spark Scala 数据框中拆分逗号分隔的字符串并获取 n 个值?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Scala/Spark 的数据框中扩展数组 [重复]
如何在 Scala/Spark 中为数据框中的每一行编写一个 Json 文件并重命名文件
如何访问存储在scala spark中的数据框中的映射值和键