7

group by から最初の null 以外の値を取得するにはどうすればよいですか? 合体で最初に使用しようとしましたが、目的の動作が得られません (最初の行を取得したようです)。 F.first(F.coalesce("code"))

from pyspark import SparkContext
from pyspark.sql import SQLContext
from pyspark.sql import functions as F

sc = SparkContext("local")

sqlContext = SQLContext(sc)

df = sqlContext.createDataFrame([
    ("a", None, None),
    ("a", "code1", None),
    ("a", "code2", "name2"),
], ["id", "code", "name"])

私は試した:

(df
  .groupby("id")
  .agg(F.first(F.coalesce("code")),
       F.first(F.coalesce("name")))
  .collect())

望ましい出力

[Row(id='a', code='code1', name='name2')]
4

2 に答える 2

19

Spark 1.3 ~ 1.5 の場合、これでうまくいく可能性があります。

from pyspark.sql import functions as F
df.groupBy(df['id']).agg(F.first(df['code']), F.first(df['name'])).show()

+---+-----------+-----------+
| id|FIRST(code)|FIRST(name)|
+---+-----------+-----------+
|  a|      code1|      name2|
+---+-----------+-----------+

編集

どうやら、バージョン 1.6 ではfirst集計関数の処理方法が変更されたようです。ここで、基になるクラスは、集計関数によってまだ使用されていないFirst2 番目の引数パラメーターを使用して構築する必要があります (ここで確認できるように)。ただし、Spark 2.0 では、null を無視するために呼び出すことができます (ここで確認できます)。ignoreNullsExprfirstagg(F.first(col, True))

したがって、Spark 1.6 の場合、残念ながらアプローチが異なり、少し効率が悪くなります。1つのアイデアは次のとおりです。

from pyspark.sql import functions as F
df1 = df.select('id', 'code').filter(df['code'].isNotNull()).groupBy(df['id']).agg(F.first(df['code']))
df2 = df.select('id', 'name').filter(df['name'].isNotNull()).groupBy(df['id']).agg(F.first(df['name']))
result = df1.join(df2, 'id')
result.show()

+---+-------------+-------------+
| id|first(code)()|first(name)()|
+---+-------------+-------------+
|  a|        code1|        name2|
+---+-------------+-------------+

たぶん、より良いオプションがあります。答えが見つかったら編集します。

于 2016-05-20T12:06:14.383 に答える