Sparkデータフレーム列の最大値を取得する最良の方法 質問する

Sparkデータフレーム列の最大値を取得する最良の方法 質問する

Spark データフレーム列の最大値を取得する最良の方法を見つけようとしています。

次の例を考えてみましょう。

df = spark.createDataFrame([(1., 4.), (2., 5.), (3., 6.)], ["A", "B"])
df.show()

これにより、次のものが作成されます。

+---+---+
|  A|  B|
+---+---+
|1.0|4.0|
|2.0|5.0|
|3.0|6.0|
+---+---+

私の目標は、列 A の最大値を見つけることです (調べたところ、3.0 でした)。PySpark を使用する場合、考えられるアプローチは次の 4 つです。

# Method 1: Use describe()
float(df.describe("A").filter("summary = 'max'").select("A").first().asDict()['A'])

# Method 2: Use SQL
df.registerTempTable("df_table")
spark.sql("SELECT MAX(A) as maxval FROM df_table").first().asDict()['maxval']

# Method 3: Use groupby()
df.groupby().max('A').first().asDict()['max(A)']

# Method 4: Convert to RDD
df.select("A").rdd.max()[0]

上記のそれぞれが正しい答えを提供しますが、Spark プロファイリング ツールがないため、どれが最適かはわかりません。

上記の方法のうち、Spark のランタイムまたはリソースの使用の観点から最も効率的なものはどれか、または上記の方法よりも直接的な方法はあるかについて、直感的または経験的な観点から何かアイデアはありますか?

ベストアンサー1

>df1.show()
+-----+--------------------+--------+----------+-----------+
|floor|           timestamp|     uid|         x|          y|
+-----+--------------------+--------+----------+-----------+
|    1|2014-07-19T16:00:...|600dfbe2| 103.79211|71.50419418|
|    1|2014-07-19T16:00:...|5e7b40e1| 110.33613|100.6828393|
|    1|2014-07-19T16:00:...|285d22e4|110.066315|86.48873585|
|    1|2014-07-19T16:00:...|74d917a1| 103.78499|71.45633073|

>row1 = df1.agg({"x": "max"}).collect()[0]
>print row1
Row(max(x)=110.33613)
>print row1["max(x)"]
110.33613

答えは方法3とほぼ同じですが、方法3の「asDict()」は削除できるようです。

おすすめ記事