[英]Create Dataframe from List of tuples in Scala
我試圖從 Scala 中的元組列表創建 Dataframe,但我遇到了問題。 我有我的元組列表,例如:
`mylist` = List((17988,2), (17988,54), (17988,41), (17988,1))
這是我為兩列定義的架構:
val `outputSchema` =
StructType(
List(
StructField("SAILORID", StringType, nullable = false),
StructField("ACTIVITYID", StringType, nullable = true)))
我嘗試了下面的代碼,但它拋出了一個空指針異常。
val df = spark.createDataFrame(mylist, outputSchema);
我也嘗試了下面的一個,但同樣的空指針問題:
val rdd = spark.sparkContext.parallelize(mylist)
val df = rdd.toDF("name", "list")
df.show()
mylist = List((17988,2), (17988,54), (17988,41), (17988,1))
這是我的 Dataframe 架構:
val outputSchema =StructType(List(StructField("SAILORID", StringType, nullable = false),StructField("ACTIVITYID", StringType, nullable = true)))
val df = spark.createDataFrame(mylist, outputSchema);
我想要從上面給定列表中的單行中的每個元組中得到 Dataframe 的結果。 我應該有來自 4 個元組的 4 行,例如:
------------------------
| SAILORID | ACTIVITYID |
|----------|------------|
| 17988 | 2 |
| 17988 | 54 |
| 17988 | 41 |
| 17988 | 1 |
-------------------------
我不確定這是否有幫助,但我復制並粘貼了您的示例,看起來它對我有用。
你用的是什么版本的spark? 我的版本是:
這是我的會議記錄:
scala> import org.apache.spark.sql.types._
import org.apache.spark.sql.types._
scala> val myList = List((17988,2), (17988,54), (17988,41), (17988,1))
myList: List[(Int, Int)] = List((17988,2), (17988,54), (17988,41), (17988,1))
scala> val rdd = spark.sparkContext.parallelize(myList)
rdd: org.apache.spark.rdd.RDD[(Int, Int)] = ParallelCollectionRDD[0] at parallelize at <console>:28
scala> val df = rdd.toDF("name","list")
df: org.apache.spark.sql.DataFrame = [name: int, list: int]
scala> df.show
+-----+----+
| name|list|
+-----+----+
|17988| 2|
|17988| 54|
|17988| 41|
|17988| 1|
+-----+----+
scala>
你能試着運行我的成績單中的陳述並用你所看到的來回應嗎?
此外,我似乎無法看到具有與此調用匹配的簽名的 createDataFrame:
spark.createDataFrame(myList, outputSchema)
我能看到的唯一接受列表和模式的方法要求列表是 java.util.List[org.apache.spark.sql.Row]。
以下是可用方法列表:
def createDataFrame(rowRDD: org.apache.spark.rdd.RDD[org.apache.spark.sql.Row],schema: org.apache.spark.sql.types.StructType): org.apache.spark.sql.DataFrame
def createDataFrame(rows: java.util.List[org.apache.spark.sql.Row],schema: org.apache.spark.sql.types.StructType): org.apache.spark.sql.DataFrame
def createDataFrame(rdd: org.apache.spark.api.java.JavaRDD[_],beanClass: Class[_]): org.apache.spark.sql.DataFrame
def createDataFrame(rowRDD: org.apache.spark.api.java.JavaRDD[org.apache.spark.sql.Row],schema: org.apache.spark.sql.types.StructType): org.apache.spark.sql.DataFrame
def createDataFrame(rdd: org.apache.spark.rdd.RDD[_],beanClass: Class[_]): org.apache.spark.sql.DataFrame
def createDataFrame[A <: Product](data: Seq[A])(implicit evidence$3: reflect.runtime.universe.TypeTag[A]): org.apache.spark.sql.DataFrame
def createDataFrame(data: java.util.List[_],beanClass: Class[_]): org.apache.spark.sql.DataFrame
def createDataFrame[A <: Product](rdd: org.apache.spark.rdd.RDD[A])(implicit evidence$2: reflect.runtime.universe.TypeTag[A]): org.apache.spark.sql.DataFrame
我運行你的代碼並得到了正確的輸出。
有依賴關系:
scalaVersion := "2.11.12"
libraryDependencies ++= Seq(
"org.apache.spark" %% "spark-core" % "2.1.0",
"org.apache.spark" %% "spark-sql" % "2.1.0"
)
代碼:
val myList = List((17988, 2), (17988, 54), (17988, 41), (17988,1))
val rdd = spark.sparkContext.parallelize(myList)
val df = rdd.toDF("name", "list")
df.show()
結果:
+-----+----+
| name|list|
+-----+----+
|17988| 2|
|17988| 54|
|17988| 41|
|17988| 1|
+-----+----+
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.