将 DataFrame 转换为 RDD 并将 RDD 动态拆分为与 DataFrame 相同数量的 Columns

Posted

技术标签:

【中文标题】将 DataFrame 转换为 RDD 并将 RDD 动态拆分为与 DataFrame 相同数量的 Columns【英文标题】:Convert a DataFrame to RDD and Split the RDD into the same number of Columns as DataFrame Dynamically 【发布时间】:2021-10-06 19:43:59 【问题描述】:

我正在尝试将 DataFrame 转换为 RDD,并根据 DataFrame 中的列数动态而优雅地将它们拆分为特定数量的列

即 这是 hive 员工表中的示例数据

Id  Name    Age State   City
123 Bob 34  Texas   Dallas
456 Stan    26  Florida Tampa
val temp_df = spark.sql("Select * from employee")
val temp2_rdd = temp_df.rdd.map(x => (x(0),x(1),x(2),x(3))

我希望根据表中的列数动态生成 tem2_rdd。 不应该像我那样硬编码。

由于 Scala 中元组的最大大小为 22,任何其他可以有效保存 rdd 的集合。

编码语言:Spark Scala

请指教。

【问题讨论】:

【参考方案1】:

您可以使用 Row 对象的 toSeq 方法,而不是使用索引提取和转换每个元素。

  val temp_df = spark.sql("Select * from employee")
  // RDD[List[Any]]
  val temp2_rdd = temp_df.rdd.map(_.toSeq.toList)
  // RDD[List[String]]
  val temp3_rdd = temp_df.rdd.map(_.toSeq.map(_.toString).toList)

【讨论】:

以上是关于将 DataFrame 转换为 RDD 并将 RDD 动态拆分为与 DataFrame 相同数量的 Columns的主要内容,如果未能解决你的问题,请参考以下文章

将 Dataframe 转换为 RDD 减少了分区

将 RDD 转换为 DataFrame 并再次转换回来的开销是多少?

将 RDD 转换为 Dataframe Spark

为啥 list 应该先转换为 RDD 再转换为 Dataframe?有啥方法可以将列表转换为数据框?

将带有数组的 RDD 转换为 DataFrame

将包含 BigInt 的 RDD 转换为 Spark Dataframe