本篇文章给大家谈谈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)
- AWS S3:如何在 COPY 命令的 S3 目录中插入动态文件名
- c# – 具有动态列数的平面文件规范化
- EF-执行具有动态生成的字段的SQL查询/存储过程
- ElasticSearch 6,带有动态索引映射的copy_to
sql – 具有动态文件名的COPY(有哪些动态sql)
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 目录中插入动态文件名?
我在 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 配置。以下是一些可以考虑的方法:
- 使用清单文件 - 此文件将包含 S3 对象名称以 加载。您的处理/文件准备可以更新此文件
- 使用文件所在的固定加载文件夹进行 COPY,然后 复制后将这些文件移动到永久存储位置。
- 使用您工作台中的变量来设置月份值并替换它 在将 SQL 发布到 Redshift 时。
- 编写一些代码(Lambda?)来发出您要查找的 SQL
- 上次我检查过,您可以将对象名称保留不完整和所有 匹配的对象将被加载。去掉批号和 后缀并加载所有文件并更改一个文本。
最好使用 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# – 具有动态列数的平面文件规范化
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代码优先方法。我需要执行一个查询,该查询运行一个报表并返回带有动态生成字段的结果集。结果集中的字段可以根据条件而有所不同。是否可以使用代码优先方法(例如在DataSet中)返回结果集,还是有其他方法可以实现此目的? 谢谢。解决方法
var data = context.Database.SqlQuery<YourType>(\"Your SQL Query or SP call\");
如果只需要带有返回列的“ 1”,则必须使用标准ADO.NET“ 2”或“ 3” /“ 4”(或与数据库相关的版本)。 EF不喜欢不会返回固定列集的本机查询。
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等更多相关知识的信息可以在本站进行查询。
本文标签: