【问题标题】:How to convert a dataframe to an RDD in scala, not losing the schema of the dataframe如何在scala中将数据帧转换为RDD,而不丢失数据帧的模式
【发布时间】:2016-10-26 17:05:55
【问题描述】:

我的数据框如下:

storeId| dateId|projectId
 9     |2457583|     1047
 9     |2457576|     1048

当我做rd = resultDataframe.rdd rd 时只有数据而不是标题信息。我用 rd.first 确认了这一点,我没有得到标题信息。另外当我尝试

rd.map(f => f._1+"\t"+f._2+"\t"+f._3).saveAsTextFile("s3://pathinS3/testtab4")

我只看到

9     2457583     1047
9     2457576     1048

我希望能够将 resultDataframe 转换为制表符分隔的 csv 并将其存储在 s3 中。

s3 中的预期 csv 输出:

storeId     dateId      projectId
 9          2457583     1047
 9          2457576     1048

感谢任何帮助。提前致谢。

【问题讨论】:

  • 那么你想把架构信息放在所有的数据分区上吗?
  • 我已经在做 repartition(1) 所以我在 resultDataframe 中只有一个分区

标签: scala dataframe rdd


【解决方案1】:

你可以这样做

val rdd = df.rdd
val data = rdd.map(_.mkString("\t"))
val header = sc.parallelize(Seq(df.columns.mkString("\t")))
val rddWitHeader = header.union(data)

【讨论】:

  • 非常感谢。这行得通。只需要添加 rddWitHeader.coalesce(1).saveAsTextFile("s3Location")
【解决方案2】:

我有一个解决方法:

val columns= resultDataFrame.columns
val rddOfheader=sc.parallelize(columns)
val rddtoBesaved=resultDataFrame.rdd.map(f => (f.getAs[String](0),f.getAs[String](1),f.getAs[String](2))
val unionRDD=rddOfheader.unionAll(rddtoBeSaved)
unionRDD.coalesce(1).saveAsTextFile("foo.txt")

P.S:代码未经测试,但这应该可以工作,并且很高兴看到一个非常简单的答案,但这应该可以工作。

【讨论】:

  • val unionRDD=rddOfheader.union(rddtoBesaved) :60: error: type mismatch;找到:org.apache.spark.rdd.RDD[(String, String, String)] 需要:org.apache.spark.rdd.RDD[String] val unionRDD=rddOfheader.union(rddtoBesaved) 请检查一下。
  • 帮助我获得了派生列和使用联合的想法。谢谢。
  • The required:org.apache.spark.rdd.RDD[String] 错误应该随着 import org.apache.spark.rdd.RDD 而消失
猜你喜欢
  • 2020-03-11
  • 1970-01-01
  • 1970-01-01
  • 2016-07-28
  • 1970-01-01
  • 1970-01-01
  • 2017-01-25
  • 2019-12-08
  • 1970-01-01
相关资源
最近更新 更多