2017-10-10 8 views
1

少数の列でグループ分けされ、スキーマでわかるように、これらの列からWrappedArrayを取得しています。どうすればそれらを取り除いて次のステップに進み、orderByを実行できますか?データフレームを取得SparkでWrappedArrayの最初の値を取得するには?

val sqlDF = spark.sql("SELECT * FROM 
    parquet.`parquet/20171009121227/rels/*.parquet`") 

val final_df = groupedBy_DF.select(
    groupedBy_DF("collect_list(relev)").as("rel"), 
    groupedBy_DF("collect_list(relev2)").as("rel2")) 

は、スキーマを印刷することは、私たちを与える:final_df.printSchema

|-- rel: array (nullable = true) 
| |-- element: double (containsNull = true) 
|-- rel2: array (nullable = true) 
| |-- element: double (containsNull = true) 

サンプル出力電流:

enter image description here

を私はこれに変換しようとしています

:(上の写真から)

|-- rel: double (nullable = true) 
|-- rel2: double (nullable = true) 

理想の出力例:

-1.0,0.0 
-1.0,0.0 
+0

collect_listは確実にWrappedArrayを作成します。出力データフレームをどのようにしたいかのようにサンプル出力を提供できますか? –

+0

@RameshMaharjanグループの行が1つ多い場合は、希望の出力 – dedpo

+0

を追加しましたか?つまり、[WrappedArray(-1.0、1.0)、WrappedArray(0.0、0.0)]がある場合はどうなりますか?これを最終的な出力データフレームにどのように変換する予定ですか? –

答えて

1

常に1つの値のみを返します。代わりにfirstを使用してください。それで、配列を持つという問題に対処する必要はありません。これはgroupByの手順で実行する必要があります。

val spark = SparkSession.builder.getOrCreate() 
import spark.implicits._ 

val final_df = df.groupBy(...) 
    .agg(first($"relev").as("rel"), 
     first($"relev2").as("rel2")) 
+0

これはsparkクラスではうまくいかないので、' REPL..agg(最初に$(relev ")。as(" rel ")'を使って動作します。コンパイルとエラーが発生していないようです。 – dedpo

+0

@dedpoエラーは何ですか? 'agg'を実行するには、最初に' groupBy'を使用する必要がありますので、そのステップで実行する必要があると言いました。 'import spark.implicits._'が正しく実行され、カッコが正しいことがわかります(あなたのコメントには') 'がありません)。 – Shaido

+0

将来的には、上記のgrouping/aggは 'import org.apache.spark.sql.functions.col'を使用する必要があります。so、' df.groupBy(...) .agg(col(first($ "relev"))。as。( "rel") '。これに代わる方法は、DataFrameを使用して、補完とそれに続くsortwithPartitions – dedpo

0

col(x).getItemをお試しください:collect_list意志場合

groupedBy_DF.select(
    groupedBy_DF("collect_list(relev)").as("rel"), 
    groupedBy_DF("collect_list(relev2)").as("rel2") 
).withColumn("rel_0", col("rel").getItem(0)) 
関連する問題