我有两张桌子连在一起.
A有很多B.
通常你会这样做:
select * from a,b where b.a_id = a.id
Run Code Online (Sandbox Code Playgroud)
从b中记录的所有记录中获取记录.
如何获得b中没有任何内容的记录?
我的表格设置如下:
table name: process
fields: name, id_string
table name: value_seach
fields: id_string, value
Run Code Online (Sandbox Code Playgroud)
我想构造一个select语句,它将显示在value_search中没有条目的所有进程名称(使用它的各自的id_string).
进程表中的id_string可以为null,并且仍然具有名称,但如果可能,则需要排除这些名称.value_search中的id_string永远不能为null
我该怎么做呢?
我有两个表,我想附加它们,以便只保留表A中的所有数据,并且只有在表B的数据唯一时才添加来自表B的数据(键值在表A和B中是唯一的,但在某些情况下是密钥将出现在表A和表B中.
我认为这样做的方法将涉及某种过滤连接(反连接)以获取表B中未在表A中出现的值然后附加两个表.
我熟悉R,这是我在R中用来做这个的代码.
library("dplyr")
## Filtering join to remove values already in "TableA" from "TableB"
FilteredTableB <- anti_join(TableB,TableA, by = "Key")
## Append "FilteredTableB" to "TableA"
CombinedTable <- bind_rows(TableA,FilteredTableB)
Run Code Online (Sandbox Code Playgroud)
我如何在python中实现这一目标?
我想识别dataframe1中存在的行,这些行基于特定列在dataframe2中不存在.我使用下面的代码来获取所需的信息.
diffId <- anti_join(dat$ID,datwe$ID)
Run Code Online (Sandbox Code Playgroud)
不幸的是,我遇到了一个错误:
UseMethod中的错误("anti_join"):
没有适用于"anti_join"的方法应用于类"factor"的对象
我检查了两个数据帧中所需列的类,结果证明是这样的factor
.还试图将列分成单独的变量,假设它可以解决问题,但没有运气!
fac1 <- datwe$ID
fac2 <- dat$ID
diffId <- anti_join(fac2,fac1)
Run Code Online (Sandbox Code Playgroud)
你能分享一下你的想法吗?
谢谢
我想知道调用 except 之间是否存在性能差异(https://spark.apache.org/docs/2.1.0/api/java/org/apache/spark/sql/Dataset.html# except(org.apache. Spark.sql.Dataset)并使用左反连接。到目前为止,我看到的唯一区别是,使用左反连接,两个数据集可以具有不同的列。
我有两个表TABLE1,它们看起来像:
id name address
1 mm 123
2 nn 143
Run Code Online (Sandbox Code Playgroud)
和TABLE2 w/c看起来像:
name age
mm 6
oo 9
Run Code Online (Sandbox Code Playgroud)
我想通过比较来获得不存在的名称TABLE1
用TABLE2
.
所以基本上,我必须得到第二行,w/c有一个不存在的NN名称,TABLE2
输出应该如下所示:
id name address
2 nn 143
Run Code Online (Sandbox Code Playgroud)
我试过这个,但它不起作用:
SELECt w.* FROM TABLE1 W INNER JOIN TABLE2 V
ON W.NAME <> V.NAME
Run Code Online (Sandbox Code Playgroud)
它仍然获得现有记录.
在数据框中,我试图识别那些在 C2 列中具有值的行,而该值在任何其他行的 C1 列中都不存在。我尝试了以下代码:
in_df = sqlContext.createDataFrame([[1,None,'A'],[2,1,'B'],[3,None,'C'],[4,11,'D']],['C1','C2','C3'])
in_df.show()
+---+----+---+
| C1| C2| C3|
+---+----+---+
| 1|null| A|
| 2| 1| B|
| 3|null| C|
| 4| 11| D|
+---+----+---+
filtered = in_df.filter(in_df.C2.isNotNull())
filtered.show()
+---+---+---+
| C1| C2| C3|
+---+---+---+
| 2| 1| B|
| 4| 11| D|
+---+---+---+
Run Code Online (Sandbox Code Playgroud)
现在应用 left_anti 连接预计只会返回第 4 行,但我也得到第 2 行:
filtered.join(in_df,(in_df.C1 == filtered.C2), 'left_anti').show()
+---+---+---+
| C1| C2| C3|
+---+---+---+
| 2| 1| B|
| 4| 11| D|
+---+---+---+
Run Code Online (Sandbox Code Playgroud)
如果我“具体化”过滤后的 DF,结果将如预期:
filtered = filtered.toDF(*filtered.columns) …
Run Code Online (Sandbox Code Playgroud) 这是我的加入:
df = df_small.join(df_big, 'id', 'leftanti')
Run Code Online (Sandbox Code Playgroud)
看来我只能广播正确的数据帧。但为了让我的逻辑发挥作用(左反连接),我必须将我的df_small
放在左侧。
如何广播左侧的数据帧?
例子:
from pyspark.sql import SparkSession, functions as F
spark = SparkSession.builder.getOrCreate()
df_small = spark.range(2)
df_big = spark.range(1, 5000000)
# df_small df_big
# +---+ +-------+
# | id| | id|
# +---+ +-------+
# | 0| | 1|
# | 1| | 2|
# +---+ | ...|
# |4999999|
# +-------+
df_small = F.broadcast(df_small)
df = df_small.join(df_big, 'id', 'leftanti')
df.show()
df.explain()
# +---+
# | id|
# +---+
# …
Run Code Online (Sandbox Code Playgroud) 我需要在同一个表上的ANTI-JOIN(不存在来自表的SELECT东西... /左连接表WHERE table.id IS NULL).实际上我有一个索引来提供不存在的问题,但查询规划器选择使用位图堆扫描.
该表有1亿行,因此进行堆扫描时搞砸了......
如果Postgres可以与指标进行比较,那将会非常快.Postgres是否必须访问此ANTI-JOIN的表格?
我知道必须在某个时候访问该表以服务MVCC,但为什么这么早呢?不能只用桌子来固定,因为它可能会遗漏一些东西吗?
我有两个表:
课程:ID,名称
老师:IdUser,IdCourse,IdSchool
现在,例如,我有一个ID为10的用户和一个ID为4的学校。
我想对表Course中的所有Cousr进行选择,不要将它们的ID与IdUser 10和IdSchool 4一起记录在Table Teacher中。
我该如何查询?
我在制定MySQL查询以执行以下任务时遇到了问题,虽然我已经看到过这里讨论的类似查询,但它们与我的完全不同,我试图转换它们.问题是(相当)简单陈述.我有三张桌子,'成员','dog_shareoffered'和'dog_sharewanted'.会员可以为他们想要出售或想要购买的东西提供零个,一个或多个广告,并且细节存储在相应的提供或想要的表格中,以及放置广告的成员的ID.列'id'对于成员是唯一的,并且对于所有三个表都是通用的.我想要的查询是询问有多少成员没有在任何一个表中放置广告.
我试过几种方式来问这个问题.我能得到的最接近的是一个不崩溃的查询!(无论如何,我不是MySQL专家).以下是我从其他示例中收集到的内容,但它返回零行,我知道结果应该大于零.
SELECT id
FROM members
WHERE id IN (SELECT id
FROM dog_sharewanted
WHERE id IS NULL)
AND id IN (SELECT id
FROM dog_shareoffered
WHERE id IS NULL)
Run Code Online (Sandbox Code Playgroud)
这个查询看起来很容易理解,不像我所看到的'JOIN',但我猜我可能需要某种Join,但在这种情况下会怎样?
我有两个数据集:
df1 = pd.DataFrame(data = {'label1': ['A', 'A', 'B', 'C'], 'label2': ['a', 'b', 'c', 'd'], 'value': [1,2,3,4]})
df2 = pd.DataFrame(data = {'label1': ['A', 'A', 'D', 'E'], 'label'2': ['a', 'd', 'c','e'], 'value2': [10,12,23,14]})
Run Code Online (Sandbox Code Playgroud)
我想执行反连接,以便生成的数据框包含 df1 的行,其中在 df2 中找不到键 [['label1', 'label2']] 。
结果 df 应该是:
label1 label2 value
A b 2
B c 3
C d 4
Run Code Online (Sandbox Code Playgroud)
在使用 dplyr 的 R 中,代码将是:
df3 = anti_join(df1, df2, by = c("label1", "label2"))
Run Code Online (Sandbox Code Playgroud)
谢谢你的帮助。
我试图找出如何最好地编写一个省略返回maintable
用户 ( uuid_user
) 已经看到 ( seentable
) 的行 ( ) 的语句。用户已经看到的行存储在seentable
. 这是我的表格的简化版本。uuid
用作加入的密钥。uuid_user
标识特定用户看到的行。
不太有效:
SELECT *
FROM maintable
JOIN seentable
on maintable.uuid = seentable.uuid
WHERE maintable.uuid != seentable.uuid
Run Code Online (Sandbox Code Playgroud)
maintable
uuid (char36)
lng,lat (POINT)
timestamp (timestamp)
seentable
uuid (char36)
uuid_user (char36)
timestamp (timestamp)
Run Code Online (Sandbox Code Playgroud)