2017-11-16 12 views
0

をジッパーに一致に基づいて、私は3つの列を有するpysparkのデータフレームのA、有する:作成緯度、距離計算のための経度のペア、2つの点火データフレームに

Lat lon zip 
-69 40 trp 
-69 41 nxt 

を私は同じ列を持つ別pysparkのデータフレームBを有しますしかし、捕捉された値が異なることになる。

Lat lon zip 
-68 43 trp 
-89 45 trp 

私はAの各レコードの緯度経度のペアを作成する、データフレームBにジップをマッチングに基づく

出力RDDペアは次のようになります。

(([-69,40],[-68,43]), 
([-69,40],[-89,45])) 

これをループなしで行うことはできますか?それは別のデータフレームのすべてのライン上のデータフレームのすべてのラインを投影し、Spark cartesian product

失敗し

答えて

1

デカルト製品は任意のキーに参加せずに参加している:私はここで使用する.MAPを複製しようとしていました。 ABの2つのデータフレームがそれぞれnAnBの行であるとすると、nA x nB行のデータフレームになります。

あなたが探していることとの定期的なinner joinキーzipに参加されています

A = spark.createDataFrame([[-69,40,"trp"],[-69,41,"nxt"]], ["Lat","lon","zip"]) 
B = spark.createDataFrame([[-68,43,"trp"],[-89,45,"trp"]], ["Lat","lon","zip"]) 
A.join(B, "zip").show() 

    +---+---+---+---+---+ 
    |zip|Lat|lon|Lat|lon| 
    +---+---+---+---+---+ 
    |trp|-69| 40|-68| 43| 
    |trp|-69| 40|-89| 45| 
    +---+---+---+---+---+ 

注:は、列名の曖昧さ回避と気をつけても、あなたが例えば前に各データフレームのための構造でlon, Latを置くことができます参加する:

import pyspark.sql.functions as psf 
A = A.select("zip", psf.struct("Lat", "Long").alias("A")) 
B = B.select("zip", psf.struct("Lat", "Long").alias("B")) 

df = A.join(B, "zip") 
df.show() 
df.printSchema() 

    +---+--------+--------+ 
    |zip|  A|  B| 
    +---+--------+--------+ 
    |trp|[-69,40]|[-68,43]| 
    |trp|[-69,40]|[-89,45]| 
    +---+--------+--------+ 

    root 
    |-- zip: string (nullable = true) 
    |-- A: struct (nullable = false) 
    | |-- Lat: long (nullable = true) 
    | |-- lon: long (nullable = true) 
    |-- B: struct (nullable = false) 
    | |-- Lat: long (nullable = true) 
    | |-- lon: long (nullable = true) 
+0

okです。各zipに1000ポイントがあり、1mポイントのデータフレームに参加している場合、データフレームを作成するのに適していますか?または、RDDや配列タプルのようにメモリが少ない別の方法があります。 – muni

+0

結合時に小さなデータフレームを 'ブロードキャスト 'することができます。これは、すべてのノードにコピーしてメモリ使用量を最適化します:' A.join(psf.broadcast(B) "zip") ' – MaFF

関連する問題