web-dev-qa-db-ja.com

ScalaのIterableのリストから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)

どうして?

31
MTT

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)
23
MTT

それは、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 質問は後で受け入れられた回答と一致するように変更されました。この編集を追加して、元の質問に似た何かを探している人が見つけられるようにします。

36
sparker

最も簡単なアプローチ:

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

Spark 2では、toDS APIによってリストをDSに変換するだけでDataSetを使用できます

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

または

val ds = list.toDS()

rdddfよりも便利です

1
Nitin

私が見つけた最も簡潔な方法:

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