2016-07-25 8 views
6

私はScalaでSparkを使用しており、集約された列は匿名です。データセットから複数の列の名前を変更する便利な方法はありますか?私はasでスキーマを当てることを考えましたが、キー列は構造体(groupBy操作のため)であり、case classを定義する方法を見つけることができません。StructTypeです。集約列に名前を付ける方法は?

私は次のようにスキーマを定義しようとした:

val returnSchema = StructType(StructField("edge", StructType(StructField("src", IntegerType, true), 
                  StructField("dst", IntegerType), true)), 
           StructField("count", LongType, true)) 
edge_count.as[returnSchema] 

を私はコンパイルエラーを得た:

Message: <console>:74: error: overloaded method value apply with alternatives: 
    (fields: Array[org.apache.spark.sql.types.StructField])org.apache.spark.sql.types.StructType <and> 
    (fields: java.util.List[org.apache.spark.sql.types.StructField])org.apache.spark.sql.types.StructType <and> 
    (fields: Seq[org.apache.spark.sql.types.StructField])org.apache.spark.sql.types.StructType 
cannot be applied to (org.apache.spark.sql.types.StructField, org.apache.spark.sql.types.StructField, Boolean) 
     val returnSchema = StructType(StructField("edge", StructType(StructField("src", IntegerType, true), 
+0

あなたは私たちのコードを示してもらえますか?だから、私はより良いアプローチを策定することができますか? –

+0

3つの列を持つデータセットを持っているようなふりをする。最初の2つでグループ化し、3番目にグループ化します。キーはタプルです。私はスパーク1.6.2です。ありがとう@AlbertoBonsanto! – Emre

答えて

0

私はaliasselectと使いました。例えば、

ds.select($"key.src".as[Short], 
      $"key.dst".as[Short], 
      $"sum(count)".alias("count").as[Long]) 

まず私は、派生列名を決定するためにprintSchemaを使用する必要がありました:

> ds.printSchema 

root 
|-- key: struct (nullable = false) 
| |-- src: short (nullable = false) 
| |-- dst: short (nullable = false) 
|-- sum(count): long (nullable = true) 
6

最善の解決策は

df 
    .groupBy('a, 'b) 
    .agg(
    expr("count(*) as cnt"), 
    expr("sum(x) as x"), 
    expr("sum(y)").as("y") 
) 
、例えば、明示的に列に名前を付けることです

データセットを使用している場合は、列のタイプを指定する必要があります(例:expr("count(*) as cnt").as[Long])。

DSLを直接使用することはできますが、単純なSQL式よりも冗長であることがよくあります。

大量リネームを行う場合は、Map、次にfoldLeftというデータフレームを使用します。

+0

これは私に型不一致エラーを与えます。入力はデータセットです。 – Emre

+0

これは、 'expr()'が 'Column'を返し、データセットAPIに' TypedColumn'が必要だからです。データセットの例を表示するための答えを更新しました。 – Sim

関連する問題