簡體   English   中英

從 Scala 中的元組列表創建數據框

[英]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? 我的版本是:

  • 火花:2.4.1 和
  • 斯卡拉:2.11.12

這是我的會議記錄:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM