我正在尝试根据列的某些值将数据帧划分为n个组。最后得到以下代码。 但它看起来并不是嵌套for循环的有效内容,我正在寻找一些优雅的方法来实现以下代码。有人可以提供意见吗?
输入将是列名称,数据框应根据该名称进行划分。 所以我有一个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 :(得分: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|
+----------+------------+-------+---------+
或使用dataframe 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&#34)。显示
+----------------------+-----+-----+-----+
|patient_name_drug_name|drugC|drugX|drugY|
+----------------------+-----+-----+-----+
| m| 1| 1| 1|
| f| 1| 1| 1|
+----------------------+-----+-----+-----+