【问题标题】:Appending csv files in Azure datalake在 Azure 数据湖中附加 csv 文件
【发布时间】:2018-02-23 06:22:37
【问题描述】:

我在 azure datalake 存储中有几个 50GB+ csv 文件保存在分区文件夹下,例如 -

source/table/partition1/file1.csv
source/table/partition2/file2.csv
...
source/table/partitionN/fileN.csv 

文件具有相同的结构。我想使用 Azure Powershell 命令将所有这些文件合并/附加在一起,并在新位置生成一个大文件,而不会损坏原始文件。

我尝试了以下命令 -

Join-AzureRmDataLakeStoreItem -AccountName "DatalakeStoreName" 
-Paths "source/table/partition1/file1.csv",
"source/table/partition2/file2.csv" 
-Destination "/Merged/table/final.csv"

但这破坏了原始文件并创建了新的 final.csv 我知道,有可用的 Azure 数据工厂,但它需要部署多个代码对象,我正在处理 7000 多个这样的提要,所以理想情况下,我想通过一个 powershell 脚本运行这个合并活动。

有没有人知道任何有效且不同的解决方案来保持原始文件完好无损?

【问题讨论】:

  • 您可以先创建每个副本,然后执行连接到原始目标或其他目标吗?或者,您可以使用 Azure Data Lake Analytics 将源文件视为一个表并对其执行查询以生成新文件。

标签: powershell azure csv azure-powershell azure-data-lake


【解决方案1】:

您可以使用直接在 Powershell 中定义的 U-SQL 脚本来执行此操作。只需确保您还拥有 Azure Data Lake Analytics 帐户即可。带有 U-SQL 脚本的示例 PowerShell 脚本:

#You can also save the script locally on a file and use -ScriptPath instead of -Script
$usqlScript = @"
    @extract  = 
    SELECT 
        column1 string,
        column2 int,
        #... list all columns and data types
        columnN string,
        partition string,
        fileNumber int
    FROM source/table/{partition}/file{fileNumber}.csv

    OUTPUT @extract
        TO "combinedFiles.csv"
        USING Outputters.Csv();
"@

$adla = "DataLakeAnalyticsAccountName"
Submit-AzureRmDataLakeAnalyticsJob -AccountName $adla -Script $usqlScript -Name "JobName"

文件集 source/table/{partition}/file{fileNumber}.csv 将提取路径与该模式匹配的每个文件,并将通配符 {partition} 和 {fileNumber} 保存为列,这样您就没有在整合数据时丢失该信息。您的原始文件将保持不变。如果您还有其他问题,请告诉我!

【讨论】:

  • 感谢您提供此解决方案。我将在我的设置中检查它的可行性。有没有机会,我们知道这个 U-SQL 对于大文件的性能,多个 50gb+?
  • 性能将取决于您提供该工作的 AU(分析单元)的数量。例如,处理一个 50GB 的 CSV 文件将被划分为 50 个顶点,可以并行处理。
  • 如果文件具有相同的列、不同的列顺序,此解决方案是否有效?
猜你喜欢
  • 2021-06-22
  • 1970-01-01
  • 2022-08-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多