在scala中使用for循环的有效方法

时间:2016-11-28 21:13:21

标签: scala apache-spark dataframe

我正在尝试根据列的某些值将数据帧划分为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

1 个答案:

答案 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|
+----------------------+-----+-----+-----+