Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cassandra/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache spark 拼花文件是否保留Spark数据帧的行顺序?_Apache Spark_Apache Spark Sql_Parquet - Fatal编程技术网

Apache spark 拼花文件是否保留Spark数据帧的行顺序?

Apache spark 拼花文件是否保留Spark数据帧的行顺序?,apache-spark,apache-spark-sql,parquet,Apache Spark,Apache Spark Sql,Parquet,当我将Spark数据框保存为拼花地板文件,然后将其读回时,生成的数据框的行与原始数据框的行不同,如下面的会话所示。这是数据框还是拼花文件的“特征”?以保留行顺序的方式保存数据帧的最佳方式是什么 >>> import numpy as np >>> import pandas as pd >>> pdf = pd.DataFrame(np.random.random((10,2))) >>> pdf 0

当我将Spark数据框保存为拼花地板文件,然后将其读回时,生成的数据框的行与原始数据框的行不同,如下面的会话所示。这是数据框还是拼花文件的“特征”?以保留行顺序的方式保存数据帧的最佳方式是什么

>>> import numpy as np
>>> import pandas as pd
>>> pdf = pd.DataFrame(np.random.random((10,2)))
>>> pdf
          0         1
0  0.191519  0.622109
1  0.437728  0.785359
2  0.779976  0.272593
3  0.276464  0.801872
4  0.958139  0.875933
5  0.357817  0.500995
6  0.683463  0.712702
7  0.370251  0.561196
8  0.503083  0.013768
9  0.772827  0.882641
>>> df = sqlContext.createDataFrame(pdf)
>>> df.show()
+-------------------+--------------------+
|                  0|                   1|
+-------------------+--------------------+
| 0.1915194503788923|  0.6221087710398319|
| 0.4377277390071145|  0.7853585837137692|
| 0.7799758081188035|  0.2725926052826416|
| 0.2764642551430967|  0.8018721775350193|
| 0.9581393536837052|  0.8759326347420947|
|0.35781726995786667|  0.5009951255234587|
| 0.6834629351721363|  0.7127020269829002|
|0.37025075479039493|  0.5611961860656249|
| 0.5030831653078097|0.013768449590682241|
|  0.772826621612374|  0.8826411906361166|
+-------------------+--------------------+
>>> df.write.parquet('test.parquet')
>>> df2 = sqlContext.read.parquet('test.parquet')
>>> df2.show()
+-------------------+--------------------+
|                  0|                   1|
+-------------------+--------------------+
| 0.6834629351721363|  0.7127020269829002|
|0.37025075479039493|  0.5611961860656249|
| 0.5030831653078097|0.013768449590682241|
|  0.772826621612374|  0.8826411906361166|
| 0.7799758081188035|  0.2725926052826416|
| 0.2764642551430967|  0.8018721775350193|
| 0.1915194503788923|  0.6221087710398319|
| 0.4377277390071145|  0.7853585837137692|
| 0.9581393536837052|  0.8759326347420947|
|0.35781726995786667|  0.5009951255234587|
+-------------------+--------------------+

这似乎是Spark内部分区的结果(以及
show()
的实现)。函数
show()
基本上围绕调用
take()
包装了一些漂亮的格式,关于take的工作原理有一个很好的解释。由于对
show()
的两个调用中最初读取的分区可能不同,因此您将看到不同的值

那么,您是说,在内部,拼花文件保留行的顺序,而恰好由
show()
/
take()
读取的第一个分区是错误的(这有点奇怪,因为拼花文件应该知道每个块的顺序)?我还认为它可能与
show()
/
take()
有关,但只读取文档(“将前n行打印到控制台”)而不读取源代码。@ianalis是的,如果您阅读,文档说明
take()
首先通过“扫描一个分区”工作,而不限于第一个分区。打印的第一行
n
可能指找到的第一行
n
。Parquet应该保留文件中的行顺序(即,如果您将配置单元表指向您的文件,并使用同一命令多次查询您的数据,您将看到相同的行顺序)。谢谢!这是一个bug还是我应该提交一个功能请求?@ianalis这将是一个请求。