Skip to content

重构 Excel 数据源的插件实现 #45

@ZhengshuaiPENG

Description

@ZhengshuaiPENG

背景:

目前 Excel 数据源插件在 load 和 save 都有不少问题,需要做一次更新

关于 Excel 处理理解的原则

我们可以对单一的 excel 认知为 db , 每一个 sheet 是 该 db 下的 table, csv 可以等同于单一sheet 的 excel 文件。
在加载时,我们应该将 sheet 映射成表, load 和 save 都是以 sheet 为单位来进行操作。

Load CSV:

需要支持的特性:

  1. 指定 sheetname 进行 load 为表,在加载时可以根据参数 sheetName 参数来进行加载制定的sheet,如未显式指定,则默认加载第一个sheet

  2. 支持 skip first n lines 功能, 需要在 load 是在 where 语句中新增 skipFirstNLines 参数,值接受正整数 int 类型。比如整个 sheet 有 100 行, 当 skip 5 行,且header=false时,这里预期应该是返回第 6 - 100 行(共95行),如果skip 5 行且 header = true 时,预期是返回第 7 - 100 行,共 94 行 正确预期行为

Save Excel

Append Save

现有的行为,当 save append 时将表作为一张新的 sheet 进行 append 写入,考虑以下的代码

SET rawData=''' 
{"jack":1,"jack2":2}
{"jack":2,"jack2":3}
''';

SET savePath="/tmp/test_excel.xlsx";

LOAD jsonStr.`rawData` AS table1;

SAVE append table1 AS excel.`${savePath}`
where header = "true";

生成的结果是 “sheet1”,如下图
image

再次执行一次, 会将表以 sheet2 的方式增加到 excel 中,如下
image

这里的行为不满足 append 的定义,或者说这里要表达的语义是 SaveAsNewSheet 这么一个语义。

期望的一个 append 的 save 行为

  • 默认不指定sheet 的时候,append 应该是以追加的方式,写入默认的第一个sheet 中,需要保持 schema 对齐,否则失败

  • 指定已存在的 sheet 中,append 以追加的方式到该 sheet (行为和上一条其实是一致的)

  • 指定未存在的 sheet 中,append 以追加写的方式写入新的指定的 sheet name 中(理解为新加sheet,写表进去)

行为兼容性变更:append sheet 的方式由原先默认新增 sheet, 变成指定新的 sheet name 来进行 sheet append,能力上可以保持一致

Overwrite Save

save overwrite 会涉及 excel 文件的覆写还是sheet 的覆写,这里关键的问题,是默认不指定任何 sheet 的情况下,是覆写第一个sheet,还是将整个文件删除进行覆写。

期望的一个 overwrite 的save行为

  • 默认不指定 sheet 的时候,覆写应该是全文件覆写(从用户的心智来看,不指定任何sheet 就有两种情况,一种我只有一个sheet,另一个是我全部的sheet都不想要了)
  • 指定 sheet 的时候,覆写单一sheet

这样 save overwrite 的行为在理解上和 save append 是保持一致的, 且与 csv 数据源保持一致

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions