如何压缩 json 行文件并上传到 azure 容器?

Posted

技术标签:

【中文标题】如何压缩 json 行文件并上传到 azure 容器?【英文标题】:How to compress a json lines file and uploading to azure container? 【发布时间】:2021-10-24 03:12:11 【问题描述】:

我在 databricks 中工作,并且有一个 Pyspark 数据框,我将其转换为 pandas,然后转换为 json 行文件,并希望将其上传到 Azure 容器 (ADLS gen2)。文件很大,我想在上传之前压缩它。

我首先将 pyspark 数据帧转换为 pandas。

pandas_df = df.select("*").toPandas()

然后将其转换为换行符分隔的 json:

json_lines_data = pandas_df.to_json(orient='records', lines=True)

然后使用以下函数写入 blob 存储:

def upload_blob(json_lines_data, connection_string, container_name, blob_name): 
  blob_service_client = BlobServiceClient.from_connection_string(connection_string) 
  blob_client = blob_service_client.get_blob_client(container=container_name, blob=blob_name) 
  try: 
    blob_client.get_blob_properties() 
    blob_client.delete_blob() 
  # except if no delete necessary
  except: 
    pass
  blob_client.upload_blob(json_lines_data)

这工作正常,但每个文件的数据大约为 3 GB,并且需要很长时间才能下载,所以我宁愿压缩文件。这里的任何人都可以帮助如何压缩 json 行文件并将其上传到 azure 容器吗?我尝试了很多不同的东西,但没有任何效果。

如果有更好的方法在数据块中执行此操作,我可以更改它。我没有使用databricks编写,因为我需要输出1个文件并控制文件名。

【问题讨论】:

【参考方案1】:

有一种方法可以在上传到 blob 存储之前压缩 JSON 文件。

这是将数据转换为 JSON 并转换为二进制代码(utf-8)并最后压缩的代码。

建议您在上传功能之前添加此代码。

import json
import gzip

def compress_data(data):
    # Convert to JSON
    json_data = json.dumps(data, indent=2)
    # Convert to bytes
    encoded = json_data.encode('utf-8')
    # Compress
    compressed = gzip.compress(encoded)

参考:https://gist.github.com/LouisAmon/4bd79b8ab80d3851601f3f9016300ac4#file-json_to_gzip-py

【讨论】:

以上是关于如何压缩 json 行文件并上传到 azure 容器?的主要内容,如果未能解决你的问题,请参考以下文章

如何有效地将压缩的 json 数据推送到 azure 事件中心并在 azure 流分析中处理?

如何在不写入文件的情况下压缩流并将其上传到 Azure Blob 存储?

使用 Retrofit 将文件上传到服务器,其中内容包含在 JSON 中

从 Azure blob 存储下载所有文件,对其进行压缩并以 JAVA 格式上传 zip 文件

无法上传 brotli 预压缩的 Json

如何通过 IOT 集线器从 Xamarin PCL 项目将文件上传到 azure Blob 存储