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

时间:2019-07-24 15:47:19

标签: python pyspark avro azure-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列并添加到当前数据帧中。通常,我要展平二进制列。二进制列也可能有数组。

1 个答案:

答案 0 :(得分:0)

您不想收集数据框。相反,您应该能够投射和展平身体场。从外观上看,您正在使用来自事件中心的avro捕获。这是我用来处理此问题的代码:

var todayNY = new Date().toLocaleString("en-US", {timeZone: "America/New_York"});

if (todayNY.getDay() == 3) {
  alert('Today is Wednesday in New York');
} else {
	alert('Today is not Wednesday in New York');
}

我认为您需要的关键是from_json函数。