如何使用pyspark将Blob字符串转换为文件

时间:2019-08-25 16:24:33

标签: file dataframe pyspark blob azure-eventhub

我有一个pyspark笔记本,正在阅读azure事件集线器消息,并且其中一个字段是一个字符串,它是来自oracle数据库的blob字段(文件)。 我正在尝试将字符串转换为文件,二进制文件,然后以天蓝色将其写入blob存储,但是我不能这样做。 如何将字符串转换为文件?

  ds.selectExpr("cast (body as string) as body") \
    .select(from_json("body", schema).alias("data")) \
    .select("data.*") \
    .withColumn('test1', base64(col("BINR_ANX"))) \
    .withColumn('test2', unbase64(col("BINR_ANX")))

2 个答案:

答案 0 :(得分:0)

听起来您想从Azure事件中心读取消息并提取json消息的字段以将其存储到PySpark笔记本中的Azure Blob存储中。

如我所知,如果在PySpark中没有必要,简单的解决方案是使用Azure流分析来创建具有EventHub as inputBlob Storage as output的作业,而无需任何代码即可将表达式写入{ {3}}提取所需的数据以实现您的需求。请参阅官方教程parse JSON data in Query Language以了解操作方法。

否则,如果必须在PySpark笔记本上执行此操作,则需要按照以下步骤尝试执行。

  1. 按照官方教程Quickstart: Create a Stream Analytics job by using the Azure portal安装Python EventHub SDK,以接收消息并通过Send events to or receive events from Event Hubs using Python提取所需字段的数据。

  2. 按照官方教程json安装用于Python的Azure Blob存储SDK,以将数据存储到Azure Blob。

  3. 在一个循环中执行上述两个步骤,以连续从EventHub接收消息。

以上解决方案是Python中的常规方法。我不知道您在诸如Azure Databricks之类的Azure服务或不在Azure云中拥有的其他Azure服务中使用的PySpark笔记本。因此,如果您的pyspark笔记本位于Azure Databricks中,则没有直接访问Azure Event Hub的方法,但是Azure Blob存储作为Azure Databricks支持的数据源,可以参考官方文档Quickstart: Upload, download, and list blobs with Python轻松存储数据到没有Python Blob Storage SDK的blob中。

希望有帮助。如有任何疑问,请随时告诉我。

答案 1 :(得分:0)

我能够解决问题并写入文件,但是由于事件字符串太长,因此无法通过事件中心发送完整消息。 我通过处理一个数据帧解决了这个问题,在该数据帧中我转换了字符串和文件并将其保存到azure blob存储。

def convert_to_file(row):
  file_decode = base64.decodebytes(str(row.column_name).encode())
  filename = "/dbfs/mnt/file.xxx"
    with open(filename, "wb") as f:
        f.write(file_decode)

ds.writeStream.foreach(convert_to_file).start()