2017-08-03 47 views
1

在火花數據幀兩行我有一個像下面剖分式到使用階

nm date  id  amount 
1233 2017-01-23 9253194 2323 
1234 2017-01-24 9253196 4455 
1235 2017-01-25 9253195 5677 

我的輸出應該

1233 
2017-01-23 9253194 2323 
1234 
2017-01-24 9253196 4455 
1235 
2017-01-25 9253195 5677 

有人可以請幫我在這火花數據幀的數據。 謝謝。

+0

因此新的數據幀只能有一列? – Fabich

+0

編號不同行中的第一列和不同行中的其餘行3列 –

+0

輸出數據框包含多少列。 –

回答

0

嗯,看起來你不想要一個DataFrame作爲輸出,否則你會有類似的結構的每一行。看看這是否有幫助:

//我試着快速重新創建你的數據框。僅供參考,您可以跳過

val myList = List((1233,"2017-01-23",9253194,2323),(1234,"2017-01-24",9253196,4455),(1235,"2017-01-25",9253195,5677)) 
val myDF = myList.toDF(Seq("nm","date","id","amount"): _*) 
scala> myDF.printSchema 
root 
|-- nm: integer (nullable = false) 
|-- date: string (nullable = true) 
|-- id: integer (nullable = false) 
|-- amount: integer (nullable = false) 

//以下是如何打印指定的方式。

myDF.foreach(row => println(row.get(0)+" \n"+row.get(1)+" "+row.get(2)+" "+row.get(3))) 

如果你想在數據幀結構,你必須保持每排3個字段,然後填充一個只有一個值和下一個將全部3個值。這是混亂的,通常不切實際的需要。

0

我不確定是否要記錄/打印以控制該格式的數據幀或繼續處理此類數據幀。

如果你想用這種結構的數據框,下面的代碼生成它:

import org.apache.spark.sql.{Row, SparkSession} 
object Test extends App { 
    val sparkSession = SparkSession.builder().appName("test").master("local[*]").getOrCreate() 
    import sparkSession.implicits._ 

    val columns = Seq("nm","date","id","amount") 
    val input = List(
    (1233, "2017-01-23", 9253194, 2323), 
    (1234, "2017-01-24", 9253196, 4455), 
    (1235, "2017-01-25", 9253195, 5677) 
) 

    sparkSession.createDataset(input).toDF(columns: _*) 
    .repartition(1) 
    .flatMap { 
     case Row(nm: Int, date: String, id: Int, amount: Int) => 
     List[(String, Int, Int)](
      (nm.toString, null.asInstanceOf[Int], null.asInstanceOf[Int]), 
      (date, id, amount) 
     ) 
     } 
    .foreach(row => Console.println(row)) 
} 

但也存在一些問題:

  • 有不同類型的第一列和第二列,所以第一列必須轉換

  • Spark可能會重新分區任何行的數據集,所以最終輸出可能如下所示:

(1233,null,null) (1235,null,null) (1234,null,null) (2017-01-23,9253194,2323) (2017-01-25,9253195,5677) (2017-01-24,9253196,4455)

  • 因爲如此寫入的輸出會產生或多或少的隨機結果

  • 現在行中具有非空列的不一致數,如果你忘了關於它你會在某個時候引用一個包含null的列/字段

  • 你不能對行排序

  • 再次分組它(到含有4列行)是根本不可能的(除非你不在乎結果是否正確)

在總結,如果你要打印的行在這種格式中,您應該定義一個函數,它可以從給定的行生成一個字符串。

如果您想處理具有這種結構的數據幀,請不要這樣做。

0

可以方便地與火花SQL來完成:

sqlContext.sql("select cast(nm as string) from df 
      union all select cast(date as string) + ' ' 
          + cast(id as string) + ' ' 
          + cast(amount as string) from df")