【发布时间】:2019-02-03 19:07:27
【问题描述】:
我在尝试用空值替换 Spark 数据帧的特定列的值时遇到问题。 我有一个超过五十列的数据框,其中两列是关键列。我想创建一个具有相同架构的新数据框,并且新数据框应该具有来自键列的值和非键列中的空值。 我尝试了以下方法但遇到了问题:
//old_df is the existing Dataframe
val key_cols = List("id", "key_number")
val non_key_cols = old_df.columns.toList.filterNot(key_cols.contains(_))
val key_col_df = old_df.select(key_cols.head, key_cols.tail:_*)
val non_key_cols_df = old_df.select(non_key_cols.head, non_key_cols.tail:_*)
val list_cols = List.fill(non_key_cols_df.columns.size)("NULL")
val rdd_list_cols = spark.sparkContext.parallelize(Seq(list_cols)).map(l => Row(l:_*))
val list_df = spark.createDataFrame(rdd_list_cols, non_key_cols_df.schema)
val new_df = key_col_df.crossJoin(list_df)
当我在old_df 中只有字符串类型的列时,这种方法很好。但是我有一些 double 类型和 int 类型的列会抛出错误,因为 rdd 是一个空字符串列表。
为了避免这种情况,我尝试将list_df 作为一个空数据帧,架构为non_key_cols_df,但crossJoin 的结果是一个空数据帧,我认为这是因为一个数据帧是空的。
我的要求是将 non_key_cols 作为带有 Null 的单行数据框,以便我可以使用 key_col_df 执行 crossJoin 并形成所需的 new_df。
还有任何其他更简单的方法将除数据框的关键列之外的所有列更新为空值将解决我的问题。提前致谢
【问题讨论】:
标签: scala apache-spark dataframe null apache-spark-sql