簡體   English   中英

如何使用pySpark Databricks從BinaryType中提取列?

[英]How to Extract Columns From BinaryType Using pySpark Databricks?

問題:從數據框的二進制類型列中提取列。 數據幀是從azure的blob存儲帳戶加載的。

環境:

  • Databricks 5.4(包括Apache Spark 2.4.3)
  • Python 3.5.2

處理:

  1. 從Avro文件獲取數據
  2. 提取有用的信息並將更多的用戶友好版本寫回到鑲木地板

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM