在mysql中,如果我必须一次读取10行,我可以将查询编写为
select * from foo limit 10, 10
Run Code Online (Sandbox Code Playgroud)
然后我可以继续增加偏移量并读取整个表。
我如何在雪花中做同样的事情?
我试过
select a, b from (select a, b from foo) tempview where rownum <= 100;
Run Code Online (Sandbox Code Playgroud)
但这不起作用。
我希望从Postgres转向SnowFlake,因为我的某些功能需要运行时分析,而运行时分析在Snowflake中更快。
我只能获得用于Snowflake的Python连接器API,这将要求我创建原始查询而不是Djago ORM查询。
无论如何,我们可以使用Django连接到Snowflake并在Snowflake上执行相同的Django ORM查询。
我看到了这个老帖子 如何在Django中查询此(雪花)数据模式
但是找不到如何与Snowflake建立django连接。
我写这篇文章不是为了问问题,而是分享知识。我正在使用 Spark 连接到雪花。但我无法访问雪花。数据块中的内部 JDBC 驱动程序似乎有问题。
这是我得到的错误。
java.lang.NoClassDefFoundError:net/snowflake/client/jdbc/internal/snowflake/common/core/S3FileEncryptionMaterial
Run Code Online (Sandbox Code Playgroud)
我尝试了许多版本的雪花 jdbc 驱动程序和雪花驱动程序。好像我可以匹配到正确的。
apache-spark apache-spark-sql snowflake-cloud-data-platform databricks
我试图找到与 generate_series() (PostgreSQL 语法)等效的雪花。
SELECT generate_series(timestamp '2017-11-01', CURRENT_DATE, '1 day')
Run Code Online (Sandbox Code Playgroud) 我正在尝试使用 Snowflake 存储过程,并希望将下面存储过程中的 SQL 语句打印到屏幕上。
CREATE OR REPLACE PROCEDURE read_western_provinces()
RETURNS VARCHAR NOT NULL
LANGUAGE JAVASCRIPT
AS
$$
var return_value = "";
try {
var command = "SELECT * FROM western_provinces ORDER BY province;"
var stmt = snowflake.createStatement( {sqlText: command } );
var rs = stmt.execute();
if (rs.next()) {
return_value += rs.getColumnValue(1);
return_value += ", " + rs.getColumnValue(2);
}
while (rs.next()) {
return_value += "\n";
return_value += rs.getColumnValue(1);
return_value += ", " + rs.getColumnValue(2);
}
}
catch (err) {
result …Run Code Online (Sandbox Code Playgroud)我正在尝试修复数据集中的数组。目前,我有一个数据集,其中包含多个不同 uuid 的引用号。我想做的就是在 Snowflake 中将其展平,以便每个 uuid 的参考号都有单独的行。例如
Reference UUID
1) 9f823c2a-ced5-4dbe-be65-869311462f75 "[
""05554f65-6aa9-4dd1-6271-8ce2d60f10c4"",
""df662812-7f97-0b43-9d3e-12f64f504fbb"",
""08644a69-76ed-ce2d-afff-b236a22efa69"",
""f1162c2e-eeb5-83f6-5307-2ed644e6b9eb"",
]"
Run Code Online (Sandbox Code Playgroud)
最终应该看起来像:
Reference UUID
1) 9f823c2a-ced5-4dbe-be65-869311462f75 05554f65-6aa9-4dd1-6271-8ce2d60f10c4
2) 9f823c2a-ced5-4dbe-be65-869311462f75 df662812-7f97-0b43-9d3e-12f64f504fbb
3) 9f823c2a-ced5-4dbe-be65-869311462f75 08644a69-76ed-ce2d-afff-b236a22efa69
4) 9f823c2a-ced5-4dbe-be65-869311462f75 f1162c2e-eeb5-83f6-5307-2ed644e6b9eb
Run Code Online (Sandbox Code Playgroud)
我刚刚开始在 Snowflake 工作,所以我对它很陌生。看起来有一个横向扁平化,但这要么不能告诉我我有各种各样的错误。雪花的文档在这方面有点令人困惑。
sql arrays snowflake-schema snowflake-cloud-data-platform snowflake-task
所以,如果 Snowflake 中有这张表:
create table t (x string, y string) as select '', null;
并且您使用 file_format csv 将其复制到外部阶段,如果您未将 field_optionally_enlined_by 设置为 none 以外的其他值,则会出现此错误:
如果未指定文件格式选项 field_optionally_enlined_by ,则无法卸载空字符串。
所以,假设它设置为“”。
create stage some_stg
url='s3://<some-bucket>/<some-dir>'
file_format = (type = csv field_optionally_enclosed_by='"' compression = none)
credentials = (aws_role = '<your-arn-for-snowflake>')
Run Code Online (Sandbox Code Playgroud)
如果您不想让 Snowflake 使用您的 s3 存储桶,我确信这个问题会在内部阶段重现。
当您运行上面的表 t 的副本时:
copy into @some_stg/t.csv from t overwrite = true;
您会得到一个如下所示的文件 (t_0_0_0.csv):
"","\N"
在 postgres 中创建等效表后:
create table t (x varchar, y varchar);
当您使用 psql 复制将其加载到 postgres 时,如下所示:
psql -h …
\n \n\n\n\n在 FROM 子句中,LATERAL 关键字允许内联视图引用该内联视图之前的表表达式中的列。
\n\n横向连接的行为更像是相关子查询,而不是大多数连接。
\n
让我们稍微调整一下文档中提供的代码:
\n\nCREATE TABLE departments (department_id INTEGER, name VARCHAR);\nCREATE TABLE employees (employee_ID INTEGER, last_name VARCHAR,\n department_ID INTEGER, project_names ARRAY);\n\nINSERT INTO departments (department_ID, name) VALUES \n (1, \'Engineering\'), \n (2, \'Support\'),\n (3, \'HR\'); -- adding new row\n\nINSERT INTO employees (employee_ID, last_name, department_ID) VALUES \n (101, \'Richards\', 1),\n (102, \'Paulson\', 1),\n (103, \'Johnson\', 2); \nRun Code Online (Sandbox Code Playgroud)\n\n询问:
\n\nSELECT * \nFROM departments AS d,\nLATERAL (SELECT * FROM employees AS e \n …Run Code Online (Sandbox Code Playgroud) 这里的目标是在 AWS Linux 机器上安装dplyr-snowflakedb R包。问题是该rJava软件包无法安装,失败并显示以下错误消息:
“installation of package ‘rJava’ had non-zero exit status”
Run Code Online (Sandbox Code Playgroud)
该dplyr.snowflakedb软件包提出以下建议:
需要安装 rJava 包并使用 Java 8 来支持 SnowflakeDB JDBC 要求。这可能需要:
安装 Java 8
运行 R CMD javareconf 所以 R 使用 Java 8 作为它的 JAVA_HOME
从源代码安装 rJava,以便它可以与 Java 8 链接
尽管尝试了这些策略,rJava 仍然无法安装在 AWS linux 上。
AWS linux 实例运行的是 Java 8:
conda activate ~/anaconda3/envs/R
(R) [ec2-user@ip-xx-xx-xx-xx ~]$ java -version
>>> openjdk version "1.8.0_152-release"
>>> OpenJDK Runtime Environment (build 1.8.0_152-release-1056-b12)
>>> OpenJDK 64-Bit Server …Run Code Online (Sandbox Code Playgroud) java r amazon-web-services dplyr snowflake-cloud-data-platform
我有一个 Pandas 数据框,我正在使用 SQLAlchemy 引擎和to_sql函数将它写到 Snowflake 。它工作正常,但chunksize由于某些雪花限制,我必须使用该选项。这对于较小的数据帧也很好。但是,某些数据帧有 500k+ 行,并且每块 15k 记录,完成写入 Snowflake 需要很长时间。
我做了一些研究,发现pd_writer了 Snowflake 提供的方法,它显然可以更快地加载数据帧。我的 Python 脚本完成得更快,我看到它创建了一个包含所有正确列和正确行数的表,但每一行中每一列的值都是 NULL。
我认为这是一个NaN以NULL发行及想尽一切可能取代NaN以s None,而它确实在数据帧中的替代品,通过它获取表的时候,一切都变得NULL。
我如何才能pd_writer将这些巨大的数据帧正确写入 Snowflake?有没有可行的替代方案?
编辑:按照克里斯的回答,我决定尝试使用官方示例。这是我的代码和结果集:
import os
import pandas as pd
from snowflake.sqlalchemy import URL
from sqlalchemy import create_engine
from snowflake.connector.pandas_tools import write_pandas, pd_writer
def create_db_engine(db_name, schema_name):
return create_engine(
URL(
account=os.environ.get("DB_ACCOUNT"),
user=os.environ.get("DB_USERNAME"),
password=os.environ.get("DB_PASSWORD"),
database=db_name,
schema=schema_name,
warehouse=os.environ.get("DB_WAREHOUSE"),
role=os.environ.get("DB_ROLE"),
)
)
def create_table(out_df, table_name, idx=False):
engine = create_db_engine("dummy_db", …Run Code Online (Sandbox Code Playgroud) python sqlalchemy dataframe pandas snowflake-cloud-data-platform
snowflake-cloud-data-platform ×10
sql ×3
apache-spark ×1
arrays ×1
csv ×1
databricks ×1
dataframe ×1
django ×1
dplyr ×1
java ×1
null ×1
pandas ×1
postgresql ×1
python ×1
r ×1
sqlalchemy ×1
string ×1