我有一个csv文件,我正在尝试使用Azure Data Lake Analytics U-SQL处理该文件。我对U-SQL还是个新手,所以请容忍我。原始文件是半结构化的,我设法使用silent:true标志修复了它。现在它更加结构化了,我想用上面单元格中的数据填充空单元格。
我的数据看起来像这样:CSV with empty cells
我的问题在于前四列中的空单元格。
第二行包含我想要复制到它下面的空单元格中的数据(第3-5行)。来自行7的数据需要复制到行8,来自行9的数据需要复制到行10-13,来自行14的数据需要复制到行15-18。
必须在不更改“Amount claimed”列中的值的情况下完成此操作。
有谁有关于如何在U-SQL中实现这一点的想法吗?
谢谢。
发布于 2017-06-17 04:02:58
U-SQL通常是一种用于处理大型order-agnostic、数据的语言--这个问题并不适合它
SQL输入中没有行排序标准输入data.
行集-基本的USQL构建块-是无序的逻辑数据容器。因此,在将原始输入读入行集时,原始输入中行的顺序就会丢失;您必须使用某个排序键在U-SQL中重新创建顺序。
假设存在这样的排序密钥,
@data = SELECT A, LAST_VALUE(Col == "" ? null : Col) OVER (ORDER BY Key ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS Col FROM @input;应该这样做,因为LAST_VALUE应该忽略空值。注意-- USQL documentation实际上并没有指定是否忽略nulls它们应该是按照一般的聚合/窗口函数约定的,但这需要进行验证。
您的数据没有排序列-要创建排序列,您需要
顶点确保所有数据都由1个顶点处理-在自定义提取器中[SqlUserDefinedExtractor(AtomicFileProcessing = true)]
对于在上传之前只能在本地处理的数据量来说,这可能太复杂了。
发布于 2017-06-15 19:52:07
LAG分析函数提供对当前行之前给定物理偏移量的行的访问。在SELECT表达式中使用此分析函数可以将当前行中的值与前一行中的值进行比较。
https://msdn.microsoft.com/en-us/library/azure/mt791650.aspx
发布于 2017-10-28 07:15:09
另一种方法(LAST_VALUE对我不起作用):
如果您有一些行号或时间戳字段,则没有问题
@tb1 = SELECT * FROM
( VALUES
(1, "Noah1"),
(2, (string)null),
(3, "Noah3"),
(5, (string) null),
(6, (string)null),
(7, "Noah6"),
(8, "Noah7")
) AS T(Timestamp, a);
@tb1 =
SELECT Timestamp,
[a],
[a] != null && [a] != LEAD([a], 1) OVER(ORDER BY Timestamp ASC) AS aSwitch
FROM @tb1;
@tb1 =
SELECT Timestamp,
[a],
SUM(aSwitch ? 1 : 0) OVER(ORDER BY Timestamp ASC ROWS UNBOUNDED PRECEDING) AS aGrp
FROM @tb1;
@tb1 =
SELECT Timestamp,
FIRST_VALUE([a]) OVER(PARTITION BY aGrp ORDER BY Timestamp ASC) AS aFilled
FROM @tb1;
OUTPUT @tb1 TO "/test.csv" USING Outputters.Csv(outputHeader: true);结果:
"Timestamp","aFilled"
1,"Noah1"
2,"Noah1"
3,"Noah3"
5,"Noah3"
6,"Noah3"
7,"Noah6"
8,"Noah7"但是如果你没有这样的字段怎么办呢?在简单的情况下,您可以使用dumb字段:
@tb1 = SELECT * FROM
( VALUES
("Noah1"),
((string)null),
("Noah3"),
((string) null),
((string)null),
("Noah6"),
("Noah7")
) AS T(a);
@tb1 = SELECT 1 AS Timestamp,
[a]
FROM @tb1;https://stackoverflow.com/questions/44563714
复制相似问题