Spark SQL для меня довольно понятен. Тем не менее, я только начинаю с искрового RDD API. Как spark apply function to columns in parallel подчеркивает, что это должно позволить мне избавиться от медленных тасует дляискрообразование искры-SQL в RDD API
def handleBias(df: DataFrame, colName: String, target: String = this.target) = {
val w1 = Window.partitionBy(colName)
val w2 = Window.partitionBy(colName, target)
df.withColumn("cnt_group", count("*").over(w2))
.withColumn("pre2_" + colName, mean(target).over(w1))
.withColumn("pre_" + colName, coalesce(min(col("cnt_group")/col("cnt_foo_eq_1")).over(w1), lit(0D)))
.drop("cnt_group")
}
}
В псевдокоде: df foreach column (handleBias(column)
Таким образом, минимальный фрейм данных загружается до
val input = Seq(
(0, "A", "B", "C", "D"),
(1, "A", "B", "C", "D"),
(0, "d", "a", "jkl", "d"),
(0, "d", "g", "C", "D"),
(1, "A", "d", "t", "k"),
(1, "d", "c", "C", "D"),
(1, "c", "B", "C", "D")
)
val inputDf = input.toDF("TARGET", "col1", "col2", "col3TooMany", "col4")
но не может корректно отобразить
val rdd1_inputDf = inputDf.rdd.flatMap { x => {(0 until x.size).map(idx => (idx, x(idx)))}}
rdd1_inputDf.toDF.show
Это терпит неудачу с
java.lang.ClassNotFoundException: scala.Any
java.lang.ClassNotFoundException: scala.Any
Пример: https://github.com/geoHeil/sparkContrastCodinghttps://github.com/geoHeil/sparkContrastCoding/blob/master/src/main/scala/ColumnParallel.scala для проблемы, изложенной в этом вопросе.
Как я хочу использовать это в мл .Pipeline и шаг вывода - DataFrame, «схема потеряна», например Мне нужно будет использовать сопоставление шаблонов? это верно? Но есть много колонок, есть способ «вывести» их несколько (частичный shcema? –
Да, преобразование 'DF => RDD' вообще не использует схему (и я не думаю, что есть хороший способ заставить его использовать). Однако посмотрите на мой новый пример «Dataset»: нет необходимости использовать посредника «Dataframe», и похоже, что «DataSet» прекрасно описывает типы (в Spark 2.0 я думаю все, что вы могли бы сделать с DF, также можно сделать с помощью DS) –
@GeorgHeiler (не уверен, что вы получили уведомление о ^^^^) –