web-dev-qa-db-ja.com

最後の行を選択する方法と、インデックスでPySparkデータフレームにアクセスする方法は?

PySpark SQLデータフレームから

name age city
abc   20  A
def   30  B

最後の行を取得する方法(df.limit(1)のように、データフレームの最初の行を新しいデータフレームに取得できます)。

そして、index.like row no。でデータフレーム行にアクセスするにはどうすればよいですか? 12または200.

In pandasできる

df.tail(1) # for last row
df.ix[rowno or index] # by index
df.loc[] or by df.iloc[]

このような方法または別の方法でpysparkデータフレームにアクセスする方法に興味があります。

ありがとう

9
Satya

最後の行を取得する方法。

すべての列が順序付け可能であると想定する長くてLongい方法:

from pyspark.sql.functions import (
    col, max as max_, struct, monotonically_increasing_id
)

last_row = (df
    .withColumn("_id", monotonically_increasing_id())
    .select(max(struct("_id", *df.columns))
    .alias("tmp")).select(col("tmp.*"))
    .drop("_id"))

すべての列を順序付けできない場合は、次を試してください:

with_id = df.withColumn("_id", monotonically_increasing_id())
i = with_id.select(max_("_id")).first()[0]

with_id.where(col("_id") == i).drop("_id")

注意。 pyspark.sql.functions/`o.a.s.sql.functionsにはlast関数がありますが、 対応する式の説明 を検討するのは良い選択ではありません。

index.likeでデータフレーム行にアクセスするにはどうすればよいですか

できません。 Spark DataFrameおよびインデックスでアクセス可能。 zipWithIndexを使用してインデックスを追加できます 後でフィルタします。これに注意してくださいO(N)操作。

5
zero323
from pyspark.sql import functions as F

expr = [F.last(col).alias(col) for col in df.columns]

df.agg(*expr)

ちょっとしたヒント:あなたはまだpandasまたはR. Sparkは異なるデータを扱う方法のパラダイム。個々のセル内のデータにアクセスする必要はなくなり、今ではその全体を扱うようになりました。 that spark provide。Sparkでの変換とアクションの概念を見てください。

5

最後の行を取得する方法。

「インデックス」など、データフレームの順序付けに使用できる列がある場合、最後のレコードを取得する簡単な方法の1つは、SQLを使用することです:1)テーブルを降順で並べ、2)この順序から最初の値を取得します

df.createOrReplaceTempView("table_df")
query_latest_rec = """SELECT * FROM table_df ORDER BY index DESC limit 1"""
latest_rec = self.sqlContext.sql(query_latest_rec)
latest_rec.show()

そして、index.like row no。でデータフレーム行にアクセスするにはどうすればよいですか? 12または200.

同様の方法で任意の行にレコードを取得できます

row_number = 12
df.createOrReplaceTempView("table_df")
query_latest_rec = """SELECT * FROM (select * from table_df ORDER BY index ASC limit {0}) ord_lim ORDER BY index DESC limit 1"""
latest_rec = self.sqlContext.sql(query_latest_rec.format(row_number))
latest_rec.show()

「インデックス」列がない場合は、次を使用して作成できます

from pyspark.sql.functions import monotonically_increasing_id

df = df.withColumn("index", monotonically_increasing_id())
5

次を使用して、単調に増加する一意のand連続する整数、つまりnotmonotonically_increasing_id()の仕組み。インデックスは、DataFrameのcolNameと同じ順序で昇順になります。

_import pyspark.sql.functions as F
from pyspark.sql.window import Window as W

window = W.orderBy('colName').rowsBetween(W.unboundedPreceding, W.currentRow)

df = df\
 .withColumn('int', F.lit(1))\
 .withColumn('index', F.sum('int').over(window))\
 .drop('int')\
_

次のコードを使用して、末尾、またはDataFrameの最後のrownumsを確認します。

_rownums = 10
df.where(F.col('index')>df.count()-rownums).show()
_

次のコードを使用して、DataFrameの_start_row_から_end_row_までの行を調べます。

_start_row = 20
end_row = start_row + 10
df.where((F.col('index')>start_row) & (F.col('index')<end_row)).show()
_

zipWithIndex()は、単調に増加する一意の連続した整数を返すRDDメソッドですが、id列で修正された元のDataFrameに戻ることができる方法で実装するのがはるかに遅いようです。

0
Clay