我必须写一个pyspark连接查询。我的要求是: 我只需要选择仅存在于左表中的记录。
SQL解决方案是:
select Left.*
FROM LEFT LEFT_OUTER_JOIN RIGHT
where RIGHT.column1 is NULL and Right.column2 is NULL
对我来说,挑战是,这两个表是数据帧。我在运行时创建它们。所以我不知道正确的数据帧列详细信息或它们的编号。我必须在Right DataFrame的每一列上运行这个“Is Null”。
我需要你的帮助来解决这个问题,任何类型的运行时功能都会有所帮助。
到目前为止我的代码 -
from pyspark import SparkConf, SparkContext
from pyspark.sql import HiveContext
from pyspark.sql.functions import *
from pyspark.sql.types import *
from pyspark.sql.functions import sha2,udf
from pyspark.sql.types import StructType
import csv
import ConfigParser
import collections
import hashlib
import sys
import pandas as pd
import datetime
from datetime import datetime,timedelta
from pyspark.sql.utils import AnalysisException
from pyspark.sql import Row
emp = [('Ram',25,12,1),('Jalfaizy',22,13,2),('saurabh',20,14,3),('Bala',26,15,4)]
rddemp = sc.parallelize(emp)
emp1 = rddemp.map(lambda x: Row(name=x[0], dept=int(x[1]),col=x[2], ign=x[2]))
empDF = sqlContext.createDataFrame(emp1)
dept = [('Ram',25,12,1),('Jalfaizy',22,16,3),('Kukarm',50,17,4)]
rdddept = sc.parallelize(dept)
dept1 = rdddept.map(lambda x: Row(name=x[0], dept=int(x[1]), col=x[2], ign=x[2]))
deptDF = sqlContext.createDataFrame(dept1)
empDF1=empDF.drop("ign")
deptDF1=deptDF.drop("ign")
make_sha = udf(lambda row: hashlib.pbkdf2_hmac('sha512', str(row), b'salt', 100000))
src_sha = empDF1.withColumn("sha512", make_sha(struct([empDF1[x] for x in empDF1.columns])))
tgt_sha = deptDF1.withColumn("sha512", make_sha(struct([deptDF1[x] for x in deptDF1.columns])))
tblPrimaryKeyList="dept|name".split('|')
stgActiveDF = src_sha.alias('STG').join(tgt_sha.alias('TGT'), "sha512",'left_outer').where("TGT.name").isNull())\
.select("STG.*").drop("sha512").dropDuplicates()
问题区域,我需要帮助的地方如下。我必须用“TGT.columns”替换TGT.name:
stgActiveDF = src_sha.alias('STG').join(tgt_sha.alias('TGT'),"sha512",'left_outer').where(col("TGT.name").isNull()).select("STG.*").drop("sha512").dropDuplicates()
先谢谢。