2015-12-02 91 views
0

我試圖打印從DataFrame其特定的元素包含嵌套值:星火:從嵌套的數據幀打印元素

這是Spark SQL DataFrame我得到:

scala>result 
org.apache.spark.sql.DataFrame = [P1: struct<t1:tinyint,t2:tinyint,t3:smallint,t4:int>, P2:struct<k1:tinyint,k2:int>] 

它包含:

scala>result.take(3).foreach(println) 
[[15,78,60,1111111],[10,7525619]] 
[[15,78,60,2222222],[10,7525620]] 
[[15,78,60,3333333],[10,7525621]] 

如何從第一個結構打印第二個和第三個字段?

我嘗試這樣做:

scala>result.take(3).foreach(l => printf("Num: %d-%d\n", l(0,2),l(0,3))) 

,並得到了一個錯誤。 error: too many arguments for method apply: (i: Int)Any in trait Row

+0

您應該添加的數據幀的確定指標和錯誤消息的問題。 – Beryllium

回答

1

基於索引的訪問

result.select("p1._2", "p1._3").show() 

使用case類

你可以使用一個case class前期:

case class A(a1: Int, a2: Int, a3: Int, a4: Int) 
case class B(b1: Int, b2: Int) 
case class Record(a: A, b: B) 

,以避免給人一個有意義的名字到基於索引的訪問嵌套結構和值。

然後定義數據幀

val df = sc.parallelize(
    Seq(
    Record(A(15, 78, 60, 1111111), B(10, 7525619)), 
    Record(A(15, 78, 60, 1111111), B(10, 7525619)))).toDF() 

現在

df.select($"a.a2", $"a.a3").show() 

df.registerTempTable("df") 
sqlContext.sql("select a.a2, a.a3 from df").show() 

作爲替代方案,使用RDD

val rdd = sc.parallelize(
    Seq(
    Record(A(15, 78, 60, 1111111), B(10, 7525619)), 
    Record(A(15, 78, 60, 1111111), B(10, 7525619)))) 

,那麼你可以直接mapcase class

rdd.map { 
    rec => 
    (rec.a.a2, rec.a.a3) 
}.collect() 
+0

非常感謝!:)) – Arik

+0

@Arik你需要更多的幫助嗎?如果它解決了你的問題,你可以接受這個答案。 – Beryllium