【问题标题】:columns manipulation in fast load快速加载中的列操作
【发布时间】:2017-10-19 05:02:34
【问题描述】:

您好,我是 teradata 的新手。我正在使用快速加载将平面文件加载到我的 TD DB 中。 我的数据集(CSV 文件)包含一些问题,例如 city 列中的某些行包含正确的数据,但某些行包含 NULL。包含 NULL 的城市列的值存储到下一列,即邮政编码等。由于行中有额外的 NULL,最后一些行包含额外的列。下面给出例子。如何解决快速加载中的这些问题?有人可以用 SQL 示例回答这个问题吗?

 City    Zipcode                 country    
 xyz     12                       Esp
 abc     11                       Ger
 Null    def(city's data)         12(zipcode's data)         Por(country's data)  

【问题讨论】:

  • 如果您是 Teradata 新手,最好熟悉 Teradata Parallel Transporter (TPT)。 Fastload、MLoad 和 FastExport 现已弃用。
  • 您无法使用 FastLoad 解决此问题。输入文件中的数据实际上是什么样子的?
  • 我已经编辑了有问题的表格。我希望我的问题现在很清楚。我确实有逻辑,每当系统尝试加载城市数据时,系统必须首先扫描它,就像城市列是否包含 Null 或其他内容,然后从下一列获取数据。我不知道如何在 SQL 中实现这个逻辑
  • 再次,输入文件中的数据是什么样子的,是CSV吗? NULL是如何表示的?
  • 可能最简单的方法是使用sed 预处理数据,例如sed "s/^NULL,//"(或尝试获取正确的日期)。否则,您将作为单个列加载到临时表中,然后将CASE WHEN STRTOK(col, ',', 1) = 'NULL' THEN ... 应用于每个目标列。或者使用这种情况删除NULL,然后CSVLD

标签: sql pattern-matching teradata flat-file


【解决方案1】:

不同的方法呢?与其在快速加载中解决这个问题,不如将您的数据加载到像 DATABASENAME.CITIES_TMP 这样的临时表,其结构如下所示

City | zip_code | country | column4
xyz  | 12       | Esp     | 
NULL | abc      | 12      | Por

下一步使用结构创建目标表 DATABASENAME.CITY

City | zip_code | country |

作为最后一步,您需要运行 2 个 INSERT 查询:

INSERT INTO DATABASENAME.CITY (City, zip_code, country)
SELECT City, zip_code, country FROM DATABASENAME.CITIES_TMP
WHERE CITY not like 'NULL'/* WHERE CITY is not null - depends if null is a text value or just empty cell*/;

INSERT INTO DATABASENAME.CITY (City, zip_code, country)
SELECT Zip_code, country, column4 FROM DATABASENAME.CITIES_TMP
WHERE CITY like 'NULL' /* WHERE CITY is null - depends if null is a text value or just empty cell*/

当然,如果您的所有数据都与您提供的样本完全一样,这将起作用。 这也仅在您需要偶尔执行此操作时才有效。如果您需要每天加载几次数据,这会有点麻烦(不确定我在这种情况下是否使用了正确的词),然后您应该使用例如 Talend 工具构建某种 ETL 流程。

【讨论】:

  • 非常感谢。我采用了相同的方法并使用了 BTEQ 中的列(使用 CASE 语句)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-07
  • 1970-01-01
相关资源
最近更新 更多