首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用U-SQL用上面的数据填充空白单元格

如何使用U-SQL用上面的数据填充空白单元格
EN

Stack Overflow用户
提问于 2017-06-15 17:21:57
回答 4查看 589关注 0票数 1

我有一个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中实现这一点的想法吗?

谢谢。

EN

回答 4

Stack Overflow用户

发布于 2017-06-17 04:02:58

U-SQL通常是一种用于处理大型order-agnostic、数据的语言--这个问题并不适合它

SQL输入中没有行排序标准输入data.

  • Recreating中的行排序只能通过将提取限制为1个顶点来完成-这限制了输入数据的大小,并且与使用并行大型数据处理语言有所不同。

行集-基本的USQL构建块-是无序的逻辑数据容器。因此,在将原始输入读入行集时,原始输入中行的顺序就会丢失;您必须使用某个排序键在U-SQL中重新创建顺序。

假设存在这样的排序密钥,

代码语言:javascript
复制
@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)]

  • Add a
  1. 列。

对于在上传之前只能在本地处理的数据量来说,这可能太复杂了。

票数 3
EN

Stack Overflow用户

发布于 2017-06-15 19:52:07

LAG分析函数提供对当前行之前给定物理偏移量的行的访问。在SELECT表达式中使用此分析函数可以将当前行中的值与前一行中的值进行比较。

https://msdn.microsoft.com/en-us/library/azure/mt791650.aspx

票数 2
EN

Stack Overflow用户

发布于 2017-10-28 07:15:09

另一种方法(LAST_VALUE对我不起作用):

如果您有一些行号或时间戳字段,则没有问题

代码语言:javascript
复制
@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);

结果:

代码语言:javascript
复制
"Timestamp","aFilled"
1,"Noah1"
2,"Noah1"
3,"Noah3"
5,"Noah3"
6,"Noah3"
7,"Noah6"
8,"Noah7"

但是如果你没有这样的字段怎么办呢?在简单的情况下,您可以使用dumb字段:

代码语言:javascript
复制
@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;
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44563714

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档