我尝试使用(1,),但是不起作用,在scala中定义Tuple1的语法是什么?
(1,)
scala> val a=(1,) <console>:1: error: illegal start of simple expression val a=(1,)
nkcskrwz1#
对于基数为2或更大的元组,您可以使用括号,但是对于基数为1的元组,您需要使用Tuple1:
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)
Tuple1[T]
val t : Tuple1[Int] = Tuple1(22)
sg24os4d2#
根据定义,元组是一个有序的元素列表。虽然Tuple1存在,但我还没有看到它被显式使用,因为你通常会使用一个元素。尽管如此,没有糖,你需要使用Tuple1(1)。
Tuple1(1)
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)
3条答案
按热度按时间nkcskrwz1#
对于基数为2或更大的元组,您可以使用括号,但是对于基数为1的元组,您需要使用
Tuple1
:若要声明类型,请使用
Tuple1[T]
,例如val t : Tuple1[Int] = Tuple1(22)
sg24os4d2#
根据定义,元组是一个有序的元素列表。虽然
Tuple1
存在,但我还没有看到它被显式使用,因为你通常会使用一个元素。尽管如此,没有糖,你需要使用Tuple1(1)
。htrmnn0y3#
Spark中有一个需要Tuple1的有效用例:创建一个只有一列 Dataframe 。
它将抛出一个错误:* "目标DF的值不是序列[org. apache. spark. ml. linalg. Vector]的成员"*
要使它工作,我们必须将每行转换为Tuple1:
或者更好的方法: