Caching 转换为rdd时触发数据帧重新查询

Caching 转换为rdd时触发数据帧重新查询,caching,apache-spark,rdd,Caching,Apache Spark,Rdd,我有一个数据帧被查询为 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]) 然而,如果我继续 v

我有一个数据帧被查询为

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)
仅从rdd中获取一个随机值。执行命令时,没有指定顺序/排序。由于您有一个分布式数据集,因此不能确保每次都获得相同的值

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

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


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

对于我来说,没有订单关系,它会给出相同的结果。你是按同样的顺序跑步吗?由于您的查询具有limit 1条件,因此不应为df2.take(1)提供不同的行。您的引擎是否在df2.take(1)之后重新查询数据?其实拿不拿都没关系。我得到数据帧df1,并希望对其执行不同的操作。例如,第一个操作需要df1.rdd.saveAsTextFile(),然后是另一个操作需要执行df1.select()。但第一次操作保存的数据似乎与执行select()的数据不同。对我来说,没有顺序关系,而是给出了相同的结果。你是按同样的顺序跑步吗?由于您的查询具有limit 1条件,因此不应为df2.take(1)提供不同的行。您的引擎是否在df2.take(1)之后重新查询数据?其实拿不拿都没关系。我得到数据帧df1,并希望对其执行不同的操作。例如,第一个操作需要df1.rdd.saveAsTextFile(),然后是另一个操作需要执行df1.select()。但第一次操作保存的数据似乎与执行select()操作时保存的数据不同。事实并非如此<代码>获取(1)获取分区0的第一个元素。例如,
sc.textFile(“readme.txt”).take(1)
将始终返回
readme.txt
的第一行。这不是真的<代码>获取(1)获取分区0的第一个元素。例如,
sc.textFile(“readme.txt”).take(1)
将始终返回
readme.txt
的第一行。