GVKun编程网logo

sql – 具有动态文件名的COPY(有哪些动态sql)

21

本篇文章给大家谈谈sql–具有动态文件名的COPY,以及有哪些动态sql的知识点,同时本文还将给你拓展AWSS3:如何在COPY命令的S3目录中插入动态文件名、c#–具有动态列数的平面文件规范化、EF

本篇文章给大家谈谈sql – 具有动态文件名的COPY,以及有哪些动态sql的知识点,同时本文还将给你拓展AWS S3:如何在 COPY 命令的 S3 目录中插入动态文件名、c# – 具有动态列数的平面文件规范化、EF-执行具有动态生成的字段的SQL查询/存储过程、ElasticSearch 6,带有动态索引映射的copy_to等相关知识,希望对各位有所帮助,不要忘了收藏本站喔。

本文目录一览:

sql – 具有动态文件名的COPY(有哪些动态sql)

sql – 具有动态文件名的COPY(有哪些动态sql)

我正在尝试编写一个函数来将csv数据加载到表中.我希望输入参数是文件的路径.
CREATE OR REPLACE FUNCTION public.loaddata(filepathname varchar)
  RETURNS void AS
$BODY$
BEGIN
copY climatedata(
    climatestationid,date,prcp,prcpqflag,prcpmflag,prcpsflag,tmax,tmaxqflag,tmaxmflag,tmaxsflag,tmin,tminqflag,tminmflag,tminsflag)
  FROM $1
  WITH csv header;
END;
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;
ALTER FUNCTION public.filltmaxa(character varying)
  OWNER TO postgres;

当我尝试创建此功能时,我得到了

Syntax error at $1

它出什么问题了?

解决方法

首先,您的函数名称不匹配:
CREATE OR REPLACE FUNCTION public.loaddata(filepathname varchar)
...
ALTER FUNCTION public.filltmaxa(character varying)

但这是一个额外的问题.

回答

你需要动态sql:

CREATE OR REPLACE FUNCTION loaddata(filepathname text)
  RETURNS void AS
$func$
BEGIN

EXECUTE format ('
copY climatedata(
      climatestationid,tminsflag)
FROM %L
(FORMAT CSV,HEADER)',$1);  -- current Syntax
--- WITH CSV HEADER',$1);   -- tolerated legacy Syntax

END
$func$LANGUAGE plpgsql;

format()需要Postgresql 9.1.
这样,我们可以提供文件名而无需额外的一组(转义)单引号.呼叫:

SELECT loaddata('/absolute/path/to/my/file.csv')

这非常容易受到sql注入的影响.为了防止它,我使用%L的format()来清理文件名.这也包括必要的封闭单引号.

AWS S3:如何在 COPY 命令的 S3 目录中插入动态文件名

AWS S3:如何在 COPY 命令的 S3 目录中插入动态文件名

如何解决AWS S3:如何在 COPY 命令的 S3 目录中插入动态文件名?

我在 Redshift 有一份工作,负责每月从 S3 中提取 6 个文件。文件名遵循标准命名约定“file_label_MonthNameYYYY_Batch01.CSV”。我想修改下面的 copY 命令来动态更改 S3 目录中的文件命名,这样我就不必硬编码月份名称和 YYYY 以及批号。批号范围为 1-6。

目前,这是我所拥有的效率不高的:

copY tbl_name ( column_name1,column_name2,column_name3 )
FROM ''S3://bucket_name/folder_name/Static_File_Label_July2021_Batch01.CSV''
CREDENTIALS ''aws_access_key_id = xxx;aws_secret_access_key = xxxxx''
removequotes
EMPTYASNULL 
BLANKSASNULL 
DATEFORMAT ''MM/DD/YYYY''
delimiter '',''
IGnorEHEADER 1;

copY tbl_name ( column_name1,column_name3 )
FROM ''S3://bucket_name/folder_name/Static_File_Label_July2021_Batch02.CSV''
CREDENTIALS ''aws_access_key_id = xxx;aws_secret_access_key = xxxxx''
removequotes
EMPTYASNULL 
BLANKSASNULL 
DATEFORMAT ''MM/DD/YYYY''
delimiter '',''
IGnorEHEADER 1;

下个月动态文件名将更改为August2021_Batch01 & August2021_Batch02,依此类推。有没有办法做到这一点?提前致谢。

解决方法

对此有很多方法。哪一种最适合您的情况取决于您的情况。您的流程中需要一个层来控制每个月的 SQL 配置。以下是一些可以考虑的方法:

  1. 使用清单文件 - 此文件将包含 S3 对象名称以 加载。您的处理/文件准备可以更新此文件
  2. 使用文件所在的固定加载文件夹进行 COPY,然后 复制后将这些文件移动到永久存储位置。
  3. 使用您工作台中的变量来设置月份值并替换它 在将 SQL 发布到 Redshift 时。
  4. 编写一些代码(Lambda?)来发出您要查找的 SQL
  5. 上次我检查过,您可以将对象名称保留不完整和所有 匹配的对象将被加载。去掉批号和 后缀并加载所有文件并更改一个文本。

最好使用 COPY 命令(并行使用更多节点)加载多个文件,选项 1、2 和 5 可以执行此操作。

,

指定要加载的文件的 FROM 位置时,您可以指定部分文件名

以下是来自 COPY examples - Amazon Redshift 的示例:

以下示例从 Amazon EMR 集群中的 lzop 压缩文件中加载包含制表符分隔数据的 SALES 表。 COPY 加载 myoutput/ 文件夹中以 part- 开头的每个文件。

copy sales
from ''emr://j-SAMPLE2B500FC/myoutput/part-*'' 
iam_role ''arn:aws:iam::0123456789012:role/MyRedshiftRole''
delimiter ''\t'' lzop;

因此,您可以指定:

FROM ''S3://bucket_name/folder_name/Static_File_Label_July2021_*''

您只需要更改月和年标识符。具有该前缀的所有文件将被一次性加载。

c# – 具有动态列数的平面文件规范化

c# – 具有动态列数的平面文件规范化

我有一个平面文件,不幸的是动态列结构.值中包含一个值,层次结构中的每个层都有自己的列.例如,我的平面文件可能类似于:

StatisticID|FileId|Tier0ObjectId|Tier1ObjectId|Tier2ObjectId|Tier3ObjectId|Status
1234|7890|abcd|efgh|ijkl|mnop|Pending
...

第二天相同的饲料可能类似于:

StatisticID|FileId|Tier0ObjectId|Tier1ObjectId|Tier2ObjectId|Status
1234|7890|abcd|efgh|ijkl|Complete
...

问题是,我并不关心所有层级;我只关心最后(底部)层的id,以及不属于层列的所有其他行数据.我需要将Feed标准化为类似于此的东西以注入关系数据库:

StatisticID|FileId|ObjectId|Status
1234|7890|ijkl|Complete
...

什么是一种有效的,易于阅读的机制,用于确定最后一层的对象id,并按照描述组织数据?我所做的每一次尝试都让我感到尴尬.

我做过的一些事情:

>我试图检查正则表达式模式的列名,识别分层的列,按名称降序排序,然后选择第一条记录……但是我这样丢失了序数列号,所以没有看起来不错.
>我已将我想要的列放入IDictionary< string,int>要引用的对象,但是再次可靠地收集动态列的序数是一个问题,而且这似乎是非常不具有效果的.

解决方法

几年前我遇到了一个类似的问题.我使用字典来映射列,它不漂亮,但它工作.

首先制作一个词典:

private Dictionary<int,int> GetColumnDictionary(string headerLine)
    {
        Dictionary<int,int> columnDictionary = new Dictionary<int,int>();
        List<string> columnNames = headerLine.Split('|').ToList();

        string maxTierObjectColumnName = GetMaxTierObjectColumnName(columnNames);
        for (int index = 0; index < columnNames.Count; index++)
        {
            if (columnNames[index] == "StatisticID")
            {
                columnDictionary.Add(0,index);
            }

            if (columnNames[index] == "FileId")
            {
                columnDictionary.Add(1,index);
            }

            if (columnNames[index] == maxTierObjectColumnName)
            {
                columnDictionary.Add(2,index);
            }

            if (columnNames[index] == "Status")
            {
                columnDictionary.Add(3,index);
            }
        }

        return columnDictionary;
    }

    private string GetMaxTierObjectColumnName(List<string> columnNames)
    {
        // Edit this function if Tier ObjectId is greater then 9
        var maxTierObjectColumnName = columnNames.Where(c => c.Contains("Tier") && c.Contains("Object")).OrderBy(c => c).Last();

        return maxTierObjectColumnName;
    }

之后它只是通过文件运行:

private List<DataObject> ParseFile(string fileName)
    {
        StreamReader streamReader = new StreamReader(fileName);

        string headerLine = streamReader.ReadLine();
        Dictionary<int,int> columnDictionary = this.GetColumnDictionary(headerLine);

        string line;
        List<DataObject> dataObjects = new List<DataObject>();
        while ((line = streamReader.ReadLine()) != null)
        {
            var lineValues = line.Split('|');

            string statId = lineValues[columnDictionary[0]];
            dataObjects.Add(
                new DataObject()
                {
                    StatisticId = lineValues[columnDictionary[0]],FileId = lineValues[columnDictionary[1]],ObjectId = lineValues[columnDictionary[2]],Status = lineValues[columnDictionary[3]]
                }
            );
        }

        return dataObjects;
    }

我希望这有助于(甚至一点点).

EF-执行具有动态生成的字段的SQL查询/存储过程

EF-执行具有动态生成的字段的SQL查询/存储过程

如何解决EF-执行具有动态生成的字段的SQL查询/存储过程?

|| 我在应用程序中使用的是EF代码优先方法。我需要执行一个查询,该查询运行一个报表并返回带有动态生成字段的结果集。结果集中的字段可以根据条件而有所不同。是否可以使用代码优先方法(例如在DataSet中)返回结果集,还是有其他方法可以实现此目的? 谢谢。     

解决方法

        (未经测试)您可以尝试定义数据类型,该数据类型将具有查询可以返回的所有可能列的属性。它必须是平面类型,没有嵌套对象,并且属性名称必须与结果集中的列相同。那你可以用
var data = context.Database.SqlQuery<YourType>(\"Your SQL Query or SP call\");
如果只需要带有返回列的“ 1”,则必须使用标准ADO.NET“ 2”或“ 3” /“ 4”(或与数据库相关的版本)。 EF不喜欢不会返回固定列集的本机查询。     

ElasticSearch 6,带有动态索引映射的copy_to

ElasticSearch 6,带有动态索引映射的copy_to

也许我缺少一些简单的东西,但仍然无法弄清楚以下内容:

从ES
6.x开始,该_all字段已弃用,建议使用copy_to说明(https://www.elastic.co/guide/en/elasticsearch/reference/current/copy-
to.html)。

但是,给我的印象是,您需要显式指定要复制到自定义_all字段的字段。但是,如果我使用动态映射,则我不事先知道字段,因此不能使用copy_to

我可以通过什么方式告诉ES将所有遇到的字段复制到自定义_all字段,以便可以在所有字段中进行搜索?

提前致谢!

答案1

小编典典

您可以使用动态模板。基本上创建一个索引,添加自定义catch_all字段,然后为所有字符串字段指定该特定属性。(以前没有做过,但是我相信这是现在的唯一方法。因为catch_all当您放置动态模板时该字段已经存在,所以它不会与catch_all-
匹配,这意味着catch_all不会复制到自身,而是对其进行检查自己确定)。

PUT my_index{  "mappings": {    "_doc": {      "dynamic_templates": [        {          "strings": {            "match_mapping_type": "string",            "mapping": {              "type": "text",              "copy_to": "catch_all"            }          }        }      ]    }  }}

今天关于sql – 具有动态文件名的COPY有哪些动态sql的介绍到此结束,谢谢您的阅读,有关AWS S3:如何在 COPY 命令的 S3 目录中插入动态文件名、c# – 具有动态列数的平面文件规范化、EF-执行具有动态生成的字段的SQL查询/存储过程、ElasticSearch 6,带有动态索引映射的copy_to等更多相关知识的信息可以在本站进行查询。

本文标签: