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()または表示できるようにします。
できません:
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
なので、何か他のものが必要な場合は調整する必要があります。