如何在Scala中定义Tuple1?

zxlwwiss  于 2022-11-23  发布在  Scala
关注(0)|答案(3)|浏览(180)

我尝试使用(1,),但是不起作用,在scala中定义Tuple1的语法是什么?

scala> val a=(1,)
<console>:1: error: illegal start of simple expression
       val a=(1,)
nkcskrwz

nkcskrwz1#

对于基数为2或更大的元组,您可以使用括号,但是对于基数为1的元组,您需要使用Tuple1

scala> val tuple1 = Tuple1(1)
tuple1: (Int,) = (1,)

scala> val tuple2 = ('a', 1)
tuple2: (Char, Int) = (a,1)

scala> val tuple3 = ('a', 1, "name")
tuple3: (Char, Int, java.lang.String) = (a,1,name)

scala> tuple1._1
res0: Int = 1
scala> tuple2._2
res1: Int = 1
scala> tuple3._1
res2: Char = a
scala> tuple3._3
res3: String = name

若要声明类型,请使用Tuple1[T],例如val t : Tuple1[Int] = Tuple1(22)

sg24os4d

sg24os4d2#

根据定义,元组是一个有序的元素列表。虽然Tuple1存在,但我还没有看到它被显式使用,因为你通常会使用一个元素。尽管如此,没有糖,你需要使用Tuple1(1)

htrmnn0y

htrmnn0y3#

Spark中有一个需要Tuple1的有效用例:创建一个只有一列 Dataframe 。

import org.apache.spark.ml.linalg.Vectors

val data = Seq(
    Vectors.sparse(5, Seq((1, 1.0), (3, 7.0))),
    Vectors.dense(2.0, 0.0, 3.0, 4.0, 5.0),
    Vectors.dense(4.0, 0.0, 0.0, 6.0, 7.0)
  )
data.toDF("features").show()

它将抛出一个错误:* "目标DF的值不是序列[org. apache. spark. ml. linalg. Vector]的成员"*
要使它工作,我们必须将每行转换为Tuple1:

val data = Seq(
    Tuple1(Vectors.sparse(5, Seq((1, 1.0), (3, 7.0)))),
    Tuple1(Vectors.dense(2.0, 0.0, 3.0, 4.0, 5.0)),
    Tuple1(Vectors.dense(4.0, 0.0, 0.0, 6.0, 7.0))
  )

或者更好的方法:

val data = Seq(
    Vectors.sparse(5, Seq((1, 1.0), (3, 7.0))),
    Vectors.dense(2.0, 0.0, 3.0, 4.0, 5.0),
    Vectors.dense(4.0, 0.0, 0.0, 6.0, 7.0)
  ).map(Tuple1.apply)

相关问题