apache Spark - 如何从 Scala 的可迭代对象列表创建 DataFrame?



我有以下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$2: reflect.runtime.universe.TypeTag[A])org.apache.spark.sql.DataFrame 
[A <: Product](rdd: org.apache.spark.rdd.RDD[A])(implicit evidence$1: reflect.runtime.universe.TypeTag[A])org.apache.spark.sql.DataFrame
cannot be applied to (List[Iterable[Any]])
          sqlContext.createDataFrame(values)

为什么?

这就是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列表创建一个2d列表的spark数据框架,这是一个正确的答案。最初的问题是https://stackoverflow.com/revisions/38063195/1这个问题后来被修改为符合一个公认的答案。添加此编辑,以便如果其他人寻找类似于原始问题的东西可以找到它。

正如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)

最简单方法:

val newList = yourList.map(Tuple1(_))
val df = spark.createDataFrame(newList).toDF("stuff")

在Spark 2中,我们可以通过toDS API将列表转换为DS来使用DataSet

val ds = list.flatMap(_.split(",")).toDS() // Records split by comma 

val ds = list.toDS()

这比rdddf更方便

我找到的最简洁的方式:

val df = spark.createDataFrame(List("A", "B", "C").map(Tuple1(_)))

相关内容

  • 没有找到相关文章

最新更新