我的任务是将数百万个JSON文件转换并整合为BIG CSV文件。
使用复制活动并映射架构,该操作将非常简单,我已经测试过,问题在于大量文件具有错误的JSON格式。
我知道这是什么错误,而且修复也非常简单,我认为我可以使用Python Data Brick活动修复字符串,然后将输出传递给copy活动,该活动可以将记录合并为大CSV文件。
我的想法是这样的,我不确定这是否是解决此任务的正确方法。我不知道在Data Brick活动中使用Copy Activy的输出
答案 0 :(得分:1)
听起来您想使用Azure Data Factory转换大量的单个JSON文件,但是正如@KamilNowinski所说,它现在不支持Azure。但是,既然您正在使用Azure Databricks,编写一个简单的Python脚本来执行相同的操作对您来说就变得更加容易。因此,一个可行的解决方案是直接通过Azure Databricks上的几个步骤直接使用Azure Storage SDK和pandas
Python程序包来完成此操作。
也许这些JSON文件都在Azure Blob存储的容器中,所以您需要通过list_blob_names
在容器中列出它们,并使用sas令牌为熊猫read_json
函数生成其url,代码如下。
from azure.storage.blob.baseblobservice import BaseBlobService
from azure.storage.blob import ContainerPermissions
from datetime import datetime, timedelta
account_name = '<your account name>'
account_key = '<your account key>'
container_name = '<your container name>'
service = BaseBlobService(account_name=account_name, account_key=account_key)
token = service.generate_container_shared_access_signature(container_name, permission=ContainerPermissions.READ, expiry=datetime.utcnow() + timedelta(hours=1),)
blob_names = service.list_blob_names(container_name)
blob_urls_with_token = (f"https://{account_name}.blob.core.windows.net/{container_name}/{blob_name}?{token}" for blob_name in blob_names)
#print(list(blob_urls_with_token))
然后,您可以通过read_json
函数直接从blob中读取这些JSON文件,以创建其熊猫数据框。
import pandas as pd
for blob_url_with_token in blob_urls_with_token:
df = pd.read_json(blob_url_with_token)
即使您要将它们合并到一个较大的CSV文件中,也可以先通过Combining / joining / merging
中列出的熊猫函数(如append
)将它们合并到一个大型数据框。
要将数据帧写入csv文件,我认为通过to_csv
函数非常容易。或者,您可以按照下面的代码将Pandas数据框转换为Azure Databricks上的PySpark数据框。
from pyspark.sql import SQLContext
from pyspark import SparkContext
sc = SparkContext()
sqlContest = SQLContext(sc)
spark_df = sqlContest.createDataFrame(df)
因此,接下来,无论您想做什么,都非常简单。而且,如果要将脚本计划为Azure Databricks中的笔记本,则可以参考正式文档Jobs
来运行Spark作业。
希望有帮助。
答案 1 :(得分:0)
将JSON文件复制到存储(例如BLOB),您可以从Databricks访问存储。然后,您可以使用Python修复文件,甚至可以在集群运行时转换为所需的格式。
因此,在“复制数据”活动中,如果还没有文件,请将文件复制到BLOB。