[英]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.