【问题标题】:Spark dataframe requery when converted to rdd转换为 rdd 时的 Spark 数据帧重新查询
【发布时间】:2015-12-10 12:24:17
【问题描述】:

我有一个数据框被查询为

val df1 = sqlContext.sql("select * from table1 limit 1")
df1.cache()
df1.take(1)
scala> Array[org.apache.spark.sql.Row] = Array([10,20151100-0000,B95A,293759,0,7698141.001,8141-11,GOOD,22.01,number,2015-10-07 11:34:37.492])

但是,如果我继续

val df2 = df1.rdd
df2.take(1)
scala> Array[org.apache.spark.sql.Row] = Array([10,20151100-0000,B95A,293759,0,7685751.001,5751-05,GOOD,0.0,number,2015-10-03 13:19:22.631])

即使我尝试缓存 df1,这两个结果也完全不同。有没有办法使结果一致,即。 df2 不会再次重新查询表以获取值吗?谢谢。

【问题讨论】:

  • 没有订单关系
  • 对我来说它给出了相同的结果。你是否按照相同的顺序运行?由于您的查询有限制 1 条件,它不应该为 df2.take(1) 提供不同的行
  • 您的引擎是否在 df2.take(1) 之后重新查询数据?实际上,是否采取(1)并不重要。我得到了数据帧 df1,并想对其执行不同的操作。例如,第一个操作我想要 df1.rdd.saveAsTextFile(),然后另一个操作我想要执行 df1.select()。但似乎我第一次操作保存的数据与我执行 select() 的数据不同。

标签: caching apache-spark rdd


【解决方案1】:

使用take(1),您只是从rdd 中取出一个随机值。执行命令时,没有指定顺序/排序。由于您拥有分布式数据集,因此无法确保每次都获得相同的值。

您可以对 rdd 进行排序/过滤,例如基于键(索引)或模式列。然后您应该能够始终提取您正在寻找的相同值。

【讨论】:

  • 这不是真的。 take(1) 获取分区 0 的第一个元素。例如,sc.textFile("readme.txt").take(1) 将始终返回 readme.txt 的第一行。
猜你喜欢
  • 2021-01-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-24
  • 2020-09-06
  • 2023-02-09
  • 2023-03-26
  • 2016-04-21
相关资源
最近更新 更多