Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spark Scala-从dataframe中的数组中删除第一个元素_Scala_Apache Spark - Fatal编程技术网

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"))