[英]How to Extract Columns From BinaryType Using pySpark Databricks?
問題:從數據框的二進制類型列中提取列。 數據幀是從azure的blob存儲帳戶加載的。
環境:
處理:
Avro模式:
SequenceNumber:long
Offset:string
EnqueuedTimeUtc:string
SystemProperties:map
key:string
value:struct
member0:long
member1:double
member2:string
member3:binary
Properties:map
key:string
value:struct
member0:long
member1:double
member2:string
member3:binary
Body:binary
我很難從Body:binary
獲取數據。 我設法使用下面的代碼片段將列轉換為字符串
df = df.withColumn("Body", col("Body").cast("string"))
我設法使用下面的代碼在正文列中提取列的列表:
#body string looks like json
dfBody = df.select(df.Body)
jsonList = (dfBody.collect())
jsonString = jsonList[0][0]
columns = []
data = json.loads(jsonString)
for key, value in data.items():
columns.append(key)
columns.sort()
print(columns)
該列表具有有趣的列,例如ID,狀態,名稱。
問題:如何添加位於正文二進制列中的ID列並添加到當前數據框中。 通常,我要展平二進制列。 二進制列也可能有數組。
您不想收集數據框。 相反,您應該能夠投射和展平身體場。 從外觀上看,您正在使用來自事件中心的avro捕獲。 這是我用來處理此問題的代碼:
from pyspark.sql.types import StringType, IntegerType, StructType, StructField
from pyspark.sql.functions import from_json, col
# Create a schema that describes the Body field
sourceSchema = StructType([
StructField("Attribute1", StringType(), False),
StructField("Attribute2", StringType(), True),
StructField("Attribute3", StringType(), True),
StructField("Attribute4", IntegerType(), True)])
# Convert Body to String and then Json applying the schema
df = df.withColumn("Body", col("Body").cast("string"))
jsonOptions = {"dateFormat" : "yyyy-MM-dd HH:mm:ss.SSS"}
df = df.withColumn("Body", from_json(df.Body, sourceSchema, jsonOptions))
# Flatten Body
for c in df.schema['Body'].dataType:
df = df.withColumn(c.name, col("Body." + c.name))
我認為您需要的關鍵是from_json函數。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.