jsonファイルがあり、SHA 256で1フィールドをハッシュしようとしています。これらのファイルはAWS S3にあります。私は現在、Apache Zeppelin上でPythonでsparkを使用しています。jsonスキーマを使用したsparkデータフレームのカラムの更新
ここは私のjsonスキーマです。私は 'mac'フィールドをハッシュしようとしています。
|-- Document: struct (nullable = true)
| |-- data: array (nullable = true)
| | |-- element: struct (containsNull = true)
| | | |-- mac: string (nullable = true)
私はいくつかのことを試しました。
from pyspark.sql.functions import UserDefinedFunction
from pyspark.sql.types import StringType
import hashlib
hcData = sqlc.read.option("inferSchema","true").json(inputPath)
hcData.registerTempTable("hcData")
name = 'Document'
udf = UserDefinedFunction(lambda x: hashlib.sha256(str(x).encode('utf-8')).hexdigest(), StringType())
new_df = hcData.select(*[udf(column).alias(name) if column == name else column for column in hcData.columns])
このコードは正常に動作します。しかし、私はMacフィールドをハッシュしようとすると何も起こりません名前の変数を変更しようとすると、
特定の名前の列が見つかりませんでした。
私は少しコードを変更しようとしました。
def valueToCategory(value):
return hashlib.sha256(str(value).encode('utf-8')).hexdigest()
udfValueToCategory = udf(valueToCategory, StringType())
df = hcData.withColumn("Document.data[0].mac",udfValueToCategory("Document.data.mac"))
このコードは、 "Document.data.mac" をハッシュし、は、ハッシュされたMACアドレスを持つ新しい列を作成します。既存の列を更新したい入れ子になっていない変数については、更新することはできますが、問題はありませんが、入れ子にされた変数に対しては、更新する方法を見つけることができませんでした。
基本的に、spark pythonを使ってネストされたjsonファイルのフィールドをハッシュしたいと思います。誰もがスキーマとスパークのデータフレームを更新する方法を知っている?