我真的不明白你想做的事,但如果你想生成使用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|
+----------------------+-----+-----+-----+
當你用'DataFrame'做這些事情,你不需要擔心'for'循環的效率。 Spark Tip 1 - 幾乎所有DataFrame上的操作都非常昂貴(相對於for-loop的效率)。 –