次の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)
どうして?
zero32 のように、最初に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の暗黙的なオブジェクトの目的です。共通の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リストの後にいることに気付いた。ここに私がスパークシェルで試したものがあります。 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
編集2:MTTによる元の質問は、これが正解である2Dリストのsparkリストからscalaデータフレームを作成する方法でした。元の質問は https://stackoverflow.com/revisions/38063195/1 質問は後で受け入れられた回答と一致するように変更されました。この編集を追加して、元の質問に似た何かを探している人が見つけられるようにします。
最も簡単なアプローチ:
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(_)))