Python 버전 3.5와 함께 Spark 버전 2.0.0을 사용하고 있습니다. GroupID와 ID라는 두 개의 열이있는 상위 테이블이 있습니다. 데이터를 3 개의 하위 집합으로 나눌 필요가 있으므로 계층화 된 샘플링을 사용하고 있습니다.
서브 세트 (샘플 A)를 얻으면 왼쪽 조인을 수행하고 샘플 A ID가 null인지 확인합니다. 예상 출력은 샘플 A의 ID를 포함하지 않는 상위 테이블의 서브 세트입니다.
spark = SparkSession.builder.enableHiveSupport().appName("myApp").getOrCreate()
data = [(0, 100), (0, 101), (0, 102), (0, 103), (0, 1000), (1, 104), (1,105), (1, 106), (1, 107), (1, 1007)]
df = spark.createDataFrame(data, ['group', 'id'])
## Stratified Sampling
fractions = dict((int(item), 0.45) for item in np.arange(0,(2)))
sampled_for_A = df.sampleBy("group", fractions, seed=7)
sampled_for_A.orderBy("id").show()
## Version 1
sampled_for_BC = df.join(sampled_for_A, df.id == sampled_for_A.id, "left_outer").select(df.group, df.id, sampled_for_A.group.alias("groupA"), sampled_for_A.id.alias("id_A"))
sampled_for_BC.where(sampled_for_BC.id_A.isNull()).show()
버전 1에서는 BC 테이블이 채워지지만 상위 테이블의 값이 복사됩니다.
Group A
+-----+----+
|group| id|
+-----+----+
| 0| 101|
| 0| 102|
| 1| 104|
| 1| 105|
| 1| 107|
| 0|1000|
+-----+----+
BC
+-----+----+------+----+
|group| id|groupA|id_A|
+-----+----+------+----+
| 1| 107| 1| 107|
| 0| 103| 0| 103|
| 1| 104| 1| 104|
| 0|1000| 0|1000|
| 1| 106| 1| 106|
| 0| 100| 0| 100|
| 1| 105| 1| 105|
| 1|1007| 1|1007|
| 0| 101| 0| 101|
| 0| 102| 0| 102|
+-----+----+------+----+
버전 2 createOrReplaceTempView 및 SQL 쿼리로 LEFT JOIN 수행하면 예상 결과가 반환됩니다.
df.createOrReplaceTempView("parentTable")
sampled_for_A.createOrReplaceTempView("groupA")
subset_BC = spark.sql('''
SELECT a.group,
a.id,
b.group AS group_A,
b.id AS id_A
FROM parentTable a
LEFT JOIN groupA b
ON a.id = b.id
WHERE b.id IS NULL
''').show()
예상대로 :
BC
+-----+----+-------+----+
|group| id|group_A|id_A|
+-----+----+-------+----+
| 0| 103| null|null|
| 1| 106| null|null|
| 0| 100| null|null|
| 1|1007| null|null|
+-----+----+-------+----+
내가 놓친 버전 1의 where 절은 무엇입니까? (또한 내 데이터에는 1 억 개의 행이 있고 버전 2에서 수행 된 SQL 왼쪽 조인도 이상하게 작동합니다. 또한 그룹 열에서 다시 분할하려고 시도했습니다.) 모든 통찰력을 높이 평가합니다.
join
버전 1은 OK이지만, 다음 선택 재정의 데이터에 합류했다. 이는 id
및 group
열이 동일한 데이터 프레임 ( df
) 에서 가져 오기 때문에 기본적으로 df.group == sampled_for_A.group
.
원하는 동작을 얻으려면 조인하기 전에 열에 별칭을 지정해야합니다. 예를 들면 다음과 같습니다.
>>> sampled_for_A_aliased = sampled_for_A \
... .select(sampled_for_A.id.alias('id_A'), sampled_for_A.group.alias('groupA'))
>>> df.join(sampled_for_A_aliased, df.id == sampled_for_A_aliased.id_A, "left_outer").show()
+-----+----+----+------+
|group| id|id_A|groupA|
+-----+----+----+------+
| 1| 107|null| null|
| 0| 103|null| null|
| 1| 104| 104| 1|
| 0|1000|1000| 0|
| 1| 106| 106| 1|
| 0| 100|null| null|
| 1| 105| 105| 1|
| 1|1007|null| null|
| 0| 101| 101| 0|
| 0| 102| 102| 0|
+-----+----+----+------+
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다