如何从 Scala 的可迭代对象列表创建 DataFrame?
How to create DataFrame from Scala's List of Iterables?
我有以下 Scala 值:
val values: List[Iterable[Any]] = Traces().evaluate(features).toList
我想将其转换为 DataFrame。
当我尝试以下操作时:
sqlContext.createDataFrame(values)
我收到这个错误:
error: overloaded method value createDataFrame with alternatives:
[A <: Product](data: Seq[A])(implicit evidence: reflect.runtime.universe.TypeTag[A])org.apache.spark.sql.DataFrame
[A <: Product](rdd: org.apache.spark.rdd.RDD[A])(implicit evidence: reflect.runtime.universe.TypeTag[A])org.apache.spark.sql.DataFrame
cannot be applied to (List[Iterable[Any]])
sqlContext.createDataFrame(values)
为什么?
如zero323所述,我们需要先将List[Iterable[Any]]
转换为List[Row]
,然后将行放入RDD
并为spark数据框准备模式。
要将List[Iterable[Any]]
转换为List[Row]
,我们可以说
val rows = values.map{x => Row(x:_*)}
然后有了像schema
这样的模式,我们可以使RDD
val rdd = sparkContext.makeRDD[RDD](rows)
最后创建一个 spark 数据框
val df = sqlContext.createDataFrame(rdd, schema)
在 Spark 2 中,我们可以通过 toDS 将列表转换为 DS 来使用 DataSet API
val ds = list.flatMap(_.split(",")).toDS() // Records split by comma
或
val ds = list.toDS()
这比rdd
或df
更方便
这就是 spark 隐含对象的用途。它允许您将常见的 Scala 集合类型转换为 DataFrame / DataSet / RDD。
这是 Spark 2.0 的示例,但它也存在于旧版本中
import org.apache.spark.sql.SparkSession
val values = List(1,2,3,4,5)
val spark = SparkSession.builder().master("local").getOrCreate()
import spark.implicits._
val df = values.toDF()
编辑:刚刚意识到您在寻找 2d 列表。这是我在 spark-shell 上试过的东西。我将 2d 列表转换为元组列表,并使用隐式转换为 DataFrame:
val values = List(List("1", "One") ,List("2", "Two") ,List("3", "Three"),List("4","4")).map(x =>(x(0), x(1)))
import spark.implicits._
val df = values.toDF
Edit2:MTT 最初提出的问题是如何从 scala 列表为二维列表创建 spark 数据帧,这是正确答案。原问题是https://whosebug.com/revisions/38063195/1
后来更改了问题以匹配已接受的答案。添加此编辑,以便其他人在寻找与原始问题类似的内容时可以找到它。
最简单的方法:
val newList = yourList.map(Tuple1(_))
val df = spark.createDataFrame(newList).toDF("stuff")
我找到的最简洁的方法:
val df = spark.createDataFrame(List("A", "B", "C").map(Tuple1(_)))
我有以下 Scala 值:
val values: List[Iterable[Any]] = Traces().evaluate(features).toList
我想将其转换为 DataFrame。
当我尝试以下操作时:
sqlContext.createDataFrame(values)
我收到这个错误:
error: overloaded method value createDataFrame with alternatives:
[A <: Product](data: Seq[A])(implicit evidence: reflect.runtime.universe.TypeTag[A])org.apache.spark.sql.DataFrame
[A <: Product](rdd: org.apache.spark.rdd.RDD[A])(implicit evidence: reflect.runtime.universe.TypeTag[A])org.apache.spark.sql.DataFrame
cannot be applied to (List[Iterable[Any]])
sqlContext.createDataFrame(values)
为什么?
如zero323所述,我们需要先将List[Iterable[Any]]
转换为List[Row]
,然后将行放入RDD
并为spark数据框准备模式。
要将List[Iterable[Any]]
转换为List[Row]
,我们可以说
val rows = values.map{x => Row(x:_*)}
然后有了像schema
这样的模式,我们可以使RDD
val rdd = sparkContext.makeRDD[RDD](rows)
最后创建一个 spark 数据框
val df = sqlContext.createDataFrame(rdd, schema)
在 Spark 2 中,我们可以通过 toDS 将列表转换为 DS 来使用 DataSet API
val ds = list.flatMap(_.split(",")).toDS() // Records split by comma
或
val ds = list.toDS()
这比rdd
或df
这就是 spark 隐含对象的用途。它允许您将常见的 Scala 集合类型转换为 DataFrame / DataSet / RDD。 这是 Spark 2.0 的示例,但它也存在于旧版本中
import org.apache.spark.sql.SparkSession
val values = List(1,2,3,4,5)
val spark = SparkSession.builder().master("local").getOrCreate()
import spark.implicits._
val df = values.toDF()
编辑:刚刚意识到您在寻找 2d 列表。这是我在 spark-shell 上试过的东西。我将 2d 列表转换为元组列表,并使用隐式转换为 DataFrame:
val values = List(List("1", "One") ,List("2", "Two") ,List("3", "Three"),List("4","4")).map(x =>(x(0), x(1)))
import spark.implicits._
val df = values.toDF
Edit2:MTT 最初提出的问题是如何从 scala 列表为二维列表创建 spark 数据帧,这是正确答案。原问题是https://whosebug.com/revisions/38063195/1 后来更改了问题以匹配已接受的答案。添加此编辑,以便其他人在寻找与原始问题类似的内容时可以找到它。
最简单的方法:
val newList = yourList.map(Tuple1(_))
val df = spark.createDataFrame(newList).toDF("stuff")
我找到的最简洁的方法:
val df = spark.createDataFrame(List("A", "B", "C").map(Tuple1(_)))