BigQuery是否支持该WITH
条款?我不喜欢格式化太多的子查询.
例如:
WITH alias_1 AS (SELECT foo1 c FROM bar)
, alias_2 AS (SELECT foo2 c FROM bar a, alias_1 b WHERE b.c = a.c)
SELECT * FROM alias_2 a;
Run Code Online (Sandbox Code Playgroud) 如果通过设置清除变量,性能或内存是否会有明显差异
x = 'something'
x = None
Run Code Online (Sandbox Code Playgroud)
而不是
x = 'something'
del x
Run Code Online (Sandbox Code Playgroud)
对于很多变量?
为了测试.repartition()
工作原理,我运行了以下代码:
rdd = sc.parallelize(range(100))
rdd.getNumPartitions()
Run Code Online (Sandbox Code Playgroud)
rdd.getNumPartitions()
结果4
.然后我跑了:
rdd = rdd.repartition(10)
rdd.getNumPartitions()
Run Code Online (Sandbox Code Playgroud)
rdd.getNumPartitions()
这次导致了10
,所以现在有10个分区.
但是,我通过以下方式检查了分区:
rdd.glom().collect()
Run Code Online (Sandbox Code Playgroud)
结果给出了4个非空列表和6个空列表.为什么没有任何元素被分发到其他6个列表?
我试图从日期分区的BigQuery表中的最新分区中选择数据,但查询仍然从整个表中读取数据.
我试过(据我所知,BigQuery不支持QUALIFY
):
SELECT col FROM table WHERE _PARTITIONTIME = (
SELECT pt FROM (
SELECT pt, RANK() OVER(ORDER by pt DESC) as rnk FROM (
SELECT _PARTITIONTIME AS pt FROM table GROUP BY 1)
)
)
WHERE rnk = 1
);
Run Code Online (Sandbox Code Playgroud)
但这不起作用并读取所有行.
SELECT col from table WHERE _PARTITIONTIME = TIMESTAMP('YYYY-MM-DD')
Run Code Online (Sandbox Code Playgroud)
'YYYY-MM-DD'
特定日期在哪里工作.
但是,我需要在将来运行此脚本,但表更新(和_PARTITIONTIME
)是不规则的.有没有办法只从BigQuery的最新分区中提取数据?
我在 PySpark 上有一个三列数据框,我试图在其上执行RANK() OVER(PARTITION BY ... ORDER BY ...)
与 SQL 相同的操作。数据框df
看起来像:
col1, col2, score
A , B , 0.500
...
Run Code Online (Sandbox Code Playgroud)
我知道我可以为此使用窗口函数:
from pyspark.sql.window import Window
from pyspark.sql import functions as F
windowSpec = Window.partitionBy(df['col1']).orderBy(df['score'].desc())
df = df.select('col1', 'col2', 'score', F.rank().over(windowSpec).alias('rnk'))
Run Code Online (Sandbox Code Playgroud)
对于非常大的df
,这需要花费大量时间跨分区整理数据。有什么办法可以提高效率吗?(如果没有必要,我不需要使用数据框。)
我有一个 CSV 文件,如下所示:
1 ,A ,a
2 ,B ,b
99,ZZ,zz
Run Code Online (Sandbox Code Playgroud)
如何导入 CSV 以删除尾随空格?
我正在运行PySpark作业,并且收到以下消息:
WARN org.apache.spark.sql.execution.Window: No Partition Defined for Window operation! Moving all data to a single partition, this can cause serious performance degradation.
Run Code Online (Sandbox Code Playgroud)
该消息表示什么,以及如何为Window操作定义分区?
编辑:
我正在尝试对整列进行排名。
我的数据组织为:
A
B
A
C
D
Run Code Online (Sandbox Code Playgroud)
而且我要:
A,1
B,3
A,1
C,4
D,5
Run Code Online (Sandbox Code Playgroud)
我不认为应该只有.orderBy()来使用.partitionBy()。问题是,这似乎导致性能下降。没有Window功能,还有另一种方法可以实现这一点吗?
如果按第一列划分,结果将是:
A,1
B,1
A,1
C,1
D,1
Run Code Online (Sandbox Code Playgroud)
我不要。
假设我有下表:
col
NULL
1
1
2
Run Code Online (Sandbox Code Playgroud)
然后我选择:
SELECT col, DENSE_RANK() OVER(ORDER BY col) as rnk from table
Run Code Online (Sandbox Code Playgroud)
然后我得到:
col rnk
NULL 1
1 2
1 2
2 3
Run Code Online (Sandbox Code Playgroud)
我想要得到的是这样的:
col rnk
NULL NULL
1 1
1 1
2 2
Run Code Online (Sandbox Code Playgroud)
但如果我查询:
SELECT col, CASE WHEN col IS NOT NULL THEN DENSE_RANK() OVER(ORDER BY col) END as rnk from table
Run Code Online (Sandbox Code Playgroud)
然后我得到:
col rnk
NULL NULL
1 2
1 2
2 3
Run Code Online (Sandbox Code Playgroud)
NULL
除了使用子句之外,还有其他方法可以在排名时忽略 s 吗WHERE
?我还有一些其他列,其行不能省略。
我有以下查询:
SELECT EXP(col) FROM `project.dataset.tablename`;
Run Code Online (Sandbox Code Playgroud)
哪里col
是FLOAT
。但是,出现此错误:Error: Floating point error in function: EXP
。
我已经尝试过EXP()
使用伪数据,并且它可以工作。例如:
SELECT EXP(col) FROM (
SELECT 1. as col UNION ALL
SELECT 2. as col);
Run Code Online (Sandbox Code Playgroud)
为什么我会在实际数据中出现浮点错误,如何解决呢?我已经尝试过诸如EXP(CAST(col as FLOAT64))
和的操作EXP(ROUND(col, n))
,但是仍然遇到相同的错误。
如何从另一个现有表创建BigQuery表?
例如,我有一张桌子:
col_1, col_2, val
... , ... , ...
Run Code Online (Sandbox Code Playgroud)
我想创建一个新表:
CREATE TABLE new_table AS (
SELECT col_1, SUM(val) AS sum_val FROM old_table) WITH DATA;
Run Code Online (Sandbox Code Playgroud)
但是,我不能先查询结果然后保存结果,因为结果太大.