2016-11-28 60 views
1

我想根據列的某些值將數據框分成n個組。並以下面的代碼結束。 但它看起來沒有效率嵌套for循環,我正在尋找一些優雅的方法來實現下面的代碼。有人可以提供意見嗎?在scala中使用循環的有效方法

輸入將成爲數據框應根據哪些名稱劃分。 所以我有一個val存儲列的不同值。 它將存儲,如:

(0)(0) = F 
(0)(1) = M 
(1)(0) = drugY 
(1)(1) = drugC 
(1)(2) = drugX 

所以我有一個列值共創造了5如下:

F and drugY 
M and drugY 
F and drugC 
M and drugC 
F and drugX 
M and drugX 
+0

當你用'DataFrame'做這些事情,你不需要擔心'for'循環的效率。 Spark Tip 1 - 幾乎所有DataFrame上的操作都非常昂貴(相對於for-loop的效率)。 –

回答

1

我真的不明白你想做的事,但如果你想生成使用Spark據幀API組合,你可以做這樣的

val patients = Seq(
    (1, "f"), 
    (2, "m") 
).toDF("id", "name") 

val drugs = Seq(
    (1, "drugY"), 
    (2, "drugC"), 
    (3, "drugX") 
).toDF("id", "name") 

patients.createOrReplaceTempView("patients") 
drugs.createOrReplaceTempView("drugs") 

sqlContext.sql("select p.id as patient_id, p.name as patient_name, d.id as drug_id, d.name as drug_name from patients p cross join drugs d").show 



+----------+------------+-------+---------+ 
|patient_id|patient_name|drug_id|drug_name| 
+----------+------------+-------+---------+ 
|   1|   f|  1| drugY| 
|   1|   f|  2| drugC| 
|   1|   f|  3| drugX| 
|   2|   m|  1| drugY| 
|   2|   m|  2| drugC| 
|   2|   m|  3| drugX| 
+----------+------------+-------+---------+ 

或數據幀API

val cartesian = patients.join(drugs) 

cartesian.show 
(2) Spark Jobs 
+---+----+---+-----+ 
| id|name| id| name| 
+---+----+---+-----+ 
| 1| f| 1|drugY| 
| 1| f| 2|drugC| 
| 1| f| 3|drugX| 
| 2| m| 1|drugY| 
| 2| m| 2|drugC| 
| 2| m| 3|drugX| 
+---+----+---+-----+ 

這之後您可以使用交叉表來獲取頻率分佈表

c.stat.crosstab( 「patient_name」, 「drug_name」)。顯示

+----------------------+-----+-----+-----+ 
|patient_name_drug_name|drugC|drugX|drugY| 
+----------------------+-----+-----+-----+ 
|      m| 1| 1| 1| 
|      f| 1| 1| 1| 
+----------------------+-----+-----+-----+ 
+0

Thnx的更新,但我的要求是在一個單一的數據幀,我必須根據某些列將其分成n個子數據幀。 在你的前例中,假設列 - patient_id,patient_name,drug_name作爲輸入被傳入。 首先,我將篩選基於patient_id 的DF因此,我將有2個與patient_id = 1,並用patient_id = 2 第二COL DF2 DFS-DF1是patient_name .I將過濾這些DF1 DF2和用於匹配patient_name的標準。所以我會有4 df: patient_id = 1 patient_name = f, patient_id = 1 patient_name = m, pat_id = 2 pat_name = f, pat_id = 2 pat_name = m – Garipaso

+0

我將過濾每個上面的數據幀進行匹配drug_name的標準 所以我將有12個數據框:: 1)patient_id = 1 patient_name = f drug_name = drugY並且很快。 一旦所有這些子數據幀都是基於給定的輸入條件創建的,我將從每個數據幀中拾取幾個隨機樣本,這是我試圖通過上述代碼實現的。但我最終得到了一些for-loops,我認爲這不是最優的。所以尋找一些關於如何實現的建議 – Garipaso

+0

爲什麼你想要很多數據幀?你對數據框有什麼看法? – oluies