Spark Scala-从dataframe中的数组中删除第一个元素
我有一个如下的数据帧Spark Scala-从dataframe中的数组中删除第一个元素,scala,apache-spark,Scala,Apache Spark,我有一个如下的数据帧 +--------------------+ | values | +--------------------+ |[[1,1,1],[3,2,4],[1,| |[[1,1,2],[2,2,4],[1,| |[[1,1,3],[4,2,4],[1,| 我想要一个列,列的末尾。到目前为止,我知道如何选择第一个元素 val df1=df.select(“values”).getItem(0),但是是否有一种方法允许我删除第一个元素 我认为不存在用于此的
+--------------------+
| values |
+--------------------+
|[[1,1,1],[3,2,4],[1,|
|[[1,1,2],[2,2,4],[1,|
|[[1,1,3],[4,2,4],[1,|
我想要一个列,列的末尾。到目前为止,我知道如何选择第一个元素
val df1=df.select(“values”).getItem(0)
,但是是否有一种方法允许我删除第一个元素 我认为不存在用于此的内置运算符。
但您可以使用自定义项,例如:
import collection.mutable.WrappedArray
def tailUdf = udf((array: WrappedArray[WrappedArray[Int]])=> array.tail)
df.select(tailUdf(col("value"))).show()
带有简单大小检查的UDF似乎是最简单的解决方案:
val df = Seq((1, Seq(1, 2, 3)), (2, Seq(4, 5))).toDF("c1", "c2")
def tail = udf( (s: Seq[Int]) => if (s.size > 1) s.tail else Seq.empty[Int] )
df.select($"c1", tail($"c2").as("c2tail")).show
// +---+------+
// | c1|c2tail|
// +---+------+
// | 1|[2, 3]|
// | 2| [5]|
// +---+------+
根据评论部分的建议,首选解决方案是使用Spark内置功能:
如果它只有一个c2的入口呢?很好,蓝色幻影。如果
c2
由0或1个元素组成,posexplode
(或explode
)将按预期为尾部生成0行,从而丢弃相应的c1
。带有大小检查的UDF(如if(s.size>1)s.tail else Seq.empty[Int]
似乎是最简单的路由。不幸的是,array\u???
方法似乎没有一个能为这么简单的事情提供解决方案。我认为拼接就足够了啊,太好了!我想你的意思是slice
?那就行了。对不起,是的,拼接也是一个切片!
df.select($"c1", slice($"c2", 2, Int.MaxValue).as("c2tail"))