2015-10-08 3 views
4

Когда я сохраняю Spark DataFrame в качестве файла паркета, тогда прочитайте его, строки результирующего DataFrame не совпадают с оригиналом, как показано в сеансе ниже. Является ли это «особенностью» DataFrames или паркетных файлов? Что было бы лучшим способом сохранить DataFrame в порядке сохранения порядка строк?Делают ли паркетные файлы порядок строк в Spark DataFrames?

>>> 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| 
+-------------------+--------------------+ 

ответ

2

Это похоже, что это результат разделения внутри Спарк (а также реализация для show()). Функция show() в значительной степени обертывает довольно красивое форматирование вокруг звонка до take(), и есть хорошее объяснение того, как принимать работы here. Так как первоначально прочитанные разделы могут быть не одинаковыми для обоих вызовов до show(), вы увидите разные значения.

+0

Итак, вы говорите, что внутри, паркетные файлы сохраняют порядок строк, и так получилось, что первый раздел, прочитанный 'show()'/'take()', неверен (это немного нечетно, потому что файлы паркета должны знать порядок каждого куска)? Я также думал, что это может быть связано с 'show()'/'take()', но только читать документы («Печатает первые n строк в консоли»), а не исходный код. – ianalis

+0

@ianalis Да, если вы читаете [здесь] (https://spark.apache.org/docs/1.1.1/api/python/pyspark.rdd.RDD-class.html#take), в документации указано, что ' take() 'работает сначала« scan_one_ partition », не ограничиваясь первым. Первые напечатанные строки 'n' могут относиться к первым найденным строкам' n'. Паркет должен сохранять порядок строк в файле (т. Е. Если вы должны указывать таблицу Hive в своих файлах и многократно запрашивать ваши данные с помощью той же команды, вы увидите тот же порядок строк). –

+0

Спасибо! Должно ли это считаться ошибкой или я должен отправить запрос функции? – ianalis