gpt4 book ai didi

azure - U-SQL 根据文件中的不同值将 CSV 文件拆分为多个文件

转载 作者:行者123 更新时间:2023-12-01 07:38:54 25 4
gpt4 key购买 nike

我在 Azure Data Lake Store 中拥有数据,并且我正在使用 U-SQL 使用 Azure 数据分析作业处理其中存在的数据。我有几个包含空间数据的 CSV 文件,类似于:

File_20170301.csv

    longtitude| lattitude | date         | hour | value1
----------+-----------+--------------+------+-------
45.121 | 21.123 | 2017-03-01 | 01 | 20
45.121 | 21.123 | 2017-03-01 | 02 | 10
45.121 | 21.123 | 2017-03-01 | 03 | 50
48.121 | 35.123 | 2017-03-01 | 01 | 60
48.121 | 35.123 | 2017-03-01 | 02 | 15
48.121 | 35.123 | 2017-03-01 | 03 | 80

File_20170302.csv

    longtitude| lattitude | date         | hour | value1
----------+-----------+--------------+------+-------
45.121 | 21.123 | 2017-03-02 | 01 | 20
45.121 | 21.123 | 2017-03-02 | 02 | 10
45.121 | 21.123 | 2017-03-02 | 03 | 50
48.121 | 35.123 | 2017-03-02 | 01 | 60
48.121 | 35.123 | 2017-03-02 | 02 | 15
48.121 | 35.123 | 2017-03-02 | 03 | 80

每个文件包含不同日期和所有经纬度组合的数据。

我想合并我拥有的所有文件并拆分数据,这样我最终可以为每个经度-纬度组合得到一个文件。

因此,在循环遍历文件夹中的所有文件并附加所有天的所有数据后,我最终会得到以下结果:

文件_45_21.csv

    longtitude| lattitude | date         | hour | value1
----------+-----------+--------------+------+-------
45.121 | 21.123 | 2017-03-01 | 01 | 20
45.121 | 21.123 | 2017-03-01 | 02 | 10
45.121 | 21.123 | 2017-03-01 | 03 | 50
45.121 | 21.123 | 2017-03-02 | 01 | 20
45.121 | 21.123 | 2017-03-02 | 02 | 10
45.121 | 21.123 | 2017-03-02 | 03 | 50

文件_48_35.csv

    longtitude| lattitude | date         | hour | value1
----------+-----------+--------------+------+-------
48.121 | 35.123 | 2017-03-01 | 01 | 60
48.121 | 35.123 | 2017-03-01 | 02 | 15
48.121 | 35.123 | 2017-03-01 | 03 | 80
48.121 | 35.123 | 2017-03-02 | 01 | 60
48.121 | 35.123 | 2017-03-02 | 02 | 15
48.121 | 35.123 | 2017-03-02 | 03 | 80

理论上应该发生以下情况:

  1. 查找数据中经度和纬度组合的不同值
  2. 采用上述不同值的数组,为每个组合创建一个文件,并根据两个参数(经度和纬度)从源文件中提取数据

我正在努力解决的是如何开始基于源中的两个参数循环和提取数据,以及如何通过参数组合的不同值“分区”数据源。

最佳答案

U-SQL 不直接支持动态 U-SQL,但可以使用“编写脚本”技术来创建输出。然后,您可以手动运行此输出,或使用 Powershell 或 Azure 数据工厂等工具来运行它。

我根据您的测试数据创建了一个简单的示例,部分基于 here 中的示例。 .

// Get the initial fileset
@input =
EXTRACT longtitude float,
lattitude float,
date string,
hour int,
value1 int,
filename string
FROM "/input/File_201703{filename}"
USING Extractors.Csv();


// Add int version of the long and lat columns for grouping on
@working =
SELECT *,
(int) longtitude AS int_long,
(int) lattitude AS int_lat
FROM @input;


// Work out the filenames
@filenames =
SELECT String.Format("File {0}_{1}.csv", int_long, int_lat) AS outputFilename,
int_long,
int_lat
FROM
(
SELECT int_long,
int_lat
FROM @working
GROUP BY int_long,
int_lat
) AS x;


// Construct the dynamic usql and output it
@output =
SELECT x.xsort, "@input = EXTRACT longtitude float, lattitude float, date string, hour int, value1 int, filename string FROM \"input/File_201703{filename}\" USING Extractors.Csv();" AS usql
FROM ( VALUES ( 10 ) ) AS x(xsort)

UNION ALL

SELECT x.xsort, "@working = SELECT *, (int) longtitude AS int_long, (int) lattitude AS int_lat FROM @input;" AS usql
FROM ( VALUES ( 20 ) ) AS x(xsort)

UNION ALL

SELECT 30 AS xsort, String.Format("OUTPUT (SELECT * FROM @working WHERE int_long == {0} AND int_lat == {1}) TO \"/output/{2}\" USING Outputters.Csv();", int_long, int_lat, outputFilename) AS usql
FROM @filenames;


// Select only the usql column and sort the output
@output =
SELECT usql
FROM @output
ORDER BY xsort
FETCH 100;


OUTPUT @output
TO "/output/dynamic.usql"
USING Outputters.Text(delimiter : ' ', quoting : false);

关于azure - U-SQL 根据文件中的不同值将 CSV 文件拆分为多个文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43227421/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com