![](/img/trans.png)
[英]Scala Spark : How to create a RDD from a list of string and convert to 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$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()
編輯:剛意識到你是二維列表之后。 這是我在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之類的schema
,我們可以使RDD
val rdd = sparkContext.makeRDD[RDD](rows)
最后創建一個火花數據框架
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()
比rdd
或df
更方便
我發現的最簡潔的方法是:
val df = spark.createDataFrame(List("A", "B", "C").map(Tuple1(_)))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.