繁体   English   中英

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

[英]How to split comma separated string and get n values in Spark Scala dataframe?

如何从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))它不起作用。 它给出了这个错误:

value take不是org.apache.spark.sql.ColumnName的成员

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

withColumn里面你可以调用getPartialstring ,你可以使用slicetake方法,如下面的示例代码段untested。

  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)失败,因为没有方法take(..)这就是你的错误信息所说的原因

错误:value take不是org.apache.spark.sql.ColumnName的成员

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

您可以使用数组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“填充”结果。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM