Я изучаю Spark в Scala из-за сильного злоупотребления Python и получаю java.lang.NullPointerException
, потому что я делаю все по-Питонски.
У меня есть 3 кадра данных формы 4x2 каждый,первый столбец - это всегда индекс 0,1,2,3, а второй столбец - это двоичная функция.Конечная цель - создать фрейм данных 4х4 с объединением всех отдельных.В python я сначала определил бы некоторый master df, а затем перебрал промежуточные, назначив в каждом цикле результирующий объединенный фрейм данных с именем переменной master dataframe (некрасиво):
dataframes = [temp1, temp2, temp3]
df = pd.DataFrame(index=[0,1,2,3]) # Master df
for temp in dataframes:
df = df.join(temp)
В Spark это не работает хорошо: q = "select * from table"
val df = sql(q)
Работает очевидно
scala> val df = df.join(sql(q))
<console>:33: error: recursive value df needs type
val df = df.join(sql(q))
Хорошо, так:
scala> val df:org.apache.spark.sql.DataFrame = df.join(sql(q))
java.lang.NullPointerException
... 50 elided
Я думаю, что весьма вероятно, что я не делаю это функциональным образом.Поэтому я попытался (уродливее!):
scala> :paste
// Entering paste mode (ctrl-D to finish)
sql(q).
join(sql(q), "device_id").
join(sql(q), "device_id").
join(sql(q), "device_id")
// Exiting paste mode, now interpreting.
res128: org.apache.spark.sql.DataFrame = [device_id: string, devtype: int ... 3 more fields]
Это выглядит просто уродливо, не элегантно и для новичка.Каким будет правильный функциональный способ Scala для этого?