如何查询结构不同的文件?

时间:2019-09-04 20:07:48

标签: azure-data-lake u-sql

是否可以对具有不同架构的文件执行查询?

我在同一目录中有两组文件。第二种类型有一个额外的字段。

类型1

id, first, last
1, liza, smith

类型2

id, first, last, state
4, alex, gordon, CT

所需结果

1, liza
4, alex

我们如何查询具有不同架构的文件,但要在哪里使用相同的输出字段?

这就是我所拥有的:

SELECT id, first                
FROM "/one 1300/{files}.csv"
USING Extractors.Csv();

@interestingRows = SELECT id, first FROM  @interestingRows;

OUTPUT @interestingRows
TO @uriPrefix + "/one 1300/output/output.csv"
USING Outputters.Csv();

3 个答案:

答案 0 :(得分:2)

CSV输出器无法解决您的问题。 您将需要一个自定义提取器来解决此问题。 我建议您使用弹性提取器

检查此:

https://github.com/Azure/usql/tree/master/Examples/FlexibleSchemaExtractor

https://blogs.msdn.microsoft.com/mrys/2016/08/15/how-to-deal-with-files-containing-rows-with-different-column-counts-in-u-sql-introducing-a-flexible-schema-extractor/

其他解决方案是分别提取具有不同架构的数据

答案 1 :(得分:1)

由于您说过这两种类型实际上在同一文件中,所以假设它们是这样的:

data

您只需将所有列都提取出来,并将引号设置为false:

//Extract the data
@extractedData =
    EXTRACT id int,
            first string,
            last string,
            state string
    FROM "data.csv"
    USING Extractors.Csv(skipFirstNRows : 1, quoting: false);

然后,您只需选择所需的字段并输出即可:

//Select the fields
@finalData = SELECT id, first FROM @extractedData;

//Output the data
OUTPUT @finalData 
    TO "/Desired Result.csv"
    USING Outputters.Csv(quoting: false);

所需结果:

Desired Result

答案 2 :(得分:1)

如何使用已知的分隔符将列导入为数据中不存在的列,然后使用字符串类的Split方法对其进行拆分呢?像这样:

@working =
    EXTRACT wholeRow  string
    FROM "/one 1300/{*}.csv"
    USING Extractors.Text(delimiter:'|');


@working =
    SELECT 
        wholeRow.Split(',')[0] AS id,
        wholeRow.Split(',')[1] AS first,
        wholeRow.Split(',')[2] AS last
    FROM @working;


OUTPUT @working
TO "/output/output.csv"
USING Outputters.Csv(quoting:false);