web-dev-qa-db-ja.com

DataFrameでのマッピング関数の適用

Databricks/pysparkの使用を開始しました。 python/spark 2.1を使用しています。テーブルにデータをアップロードしました。このテーブルは、文字列で満たされた単一の列です。列の各要素にマッピング関数を適用したいと思います。テーブルをデータフレームにロードします。

df = spark.table("mynewtable")

私が見ることができた唯一の方法は、マッピング関数を適用するためにそれをRDDに変換し、データフレームに戻ってデータを表示することでした。しかし、これにより、ジョブはステージの失敗を中止します。

df2 = df.select("_c0").rdd.flatMap(lambda x: x.append("anything")).toDF()

やりたいことは、テーブル内のデータに任意の種類のマップ関数を適用することだけです。たとえば、列の各文字列に何かを追加するか、charで分割を実行し、それをデータフレームに戻して、.show()または表示できるようにします。

13
yahalom

できません:

  • flatMapを平坦化するため、Rowを使用します。
  • appendを使用できません:

    • TupleまたはRowにはappendメソッドがありません
    • append(コレクションに存在する場合)は副作用のために実行され、Noneを返します

withColumnを使用します。

df.withColumn("foo", lit("anything"))

ただし、mapも同様に機能するはずです。

df.select("_c0").rdd.flatMap(lambda x: x + ("anything", )).toDF()

編集(コメントを指定):

おそらくudfが必要です

from pyspark.sql.functions import udf

def iplookup(s):
    return ... # Some lookup logic

iplookup_udf = udf(iplookup)

df.withColumn("foo", iplookup_udf("c0"))

デフォルトの戻り値の型はStringTypeなので、何か他のものが必要な場合は調整する必要があります。

19
hi-zir