使用python数据块在azure数据工厂中转换数据

时间:2019-06-25 15:47:59

标签: python azure azure-data-factory-2

我的任务是将数百万个JSON文件转换并整合为BIG CSV文件。

使用复制活动并映射架构,该操作将非常简单,我已经测试过,问题在于大量文件具有错误的JSON格式。

我知道这是什么错误,而且修复也非常简单,我认为我可以使用Python Data Brick活动修复字符串,然后将输出传递给copy活动,该活动可以将记录合并为大CSV文件。

我的想法是这样的,我不确定这是否是解决此任务的正确方法。我不知道在Data Brick活动中使用Copy Activy的输出 enter image description here

2 个答案:

答案 0 :(得分:1)

听起来您想使用Azure Data Factory转换大量的单个JSON文件,但是正如@KamilNowinski所说,它现在不支持Azure。但是,既然您正在使用Azure Databricks,编写一个简单的Python脚本来执行相同的操作对您来说就变得更加容易。因此,一个可行的解决方案是直接通过Azure Databricks上的几个步骤直接使用Azure Storage SDK和pandas Python程序包来完成此操作。

  1. 也许这些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))
    
  2. 然后,您可以通过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)将它们合并到一个大型数据框。

  3. 要将数据帧写入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。