我有一个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")))
答案 0 :(得分:0)
听起来您想从Azure事件中心读取消息并提取json消息的字段以将其存储到PySpark笔记本中的Azure Blob存储中。
如我所知,如果在PySpark中没有必要,简单的解决方案是使用Azure流分析来创建具有EventHub as input和Blob Storage as output的作业,而无需任何代码即可将表达式写入{ {3}}提取所需的数据以实现您的需求。请参阅官方教程parse JSON data in Query Language以了解操作方法。
否则,如果必须在PySpark笔记本上执行此操作,则需要按照以下步骤尝试执行。
按照官方教程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
提取所需字段的数据。
按照官方教程json
安装用于Python的Azure Blob存储SDK,以将数据存储到Azure Blob。
在一个循环中执行上述两个步骤,以连续从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()