2016-03-13 14 views
7

Capisco che i miei dati siano le partizioni delle funzioni partitionBy. Se utilizzo rdd.partitionBy(100), partirà i miei dati con la chiave in 100 parti. cioè i dati associati a chiavi simili saranno raggruppati insiemepyspark dati di partioning utilizzando partizione

  1. La mia comprensione è corretta?
  2. È consigliabile avere un numero di partizioni pari al numero di core disponibili ? Ciò rende l'elaborazione più efficiente?
  3. e se i miei dati non sono in chiave, formato valore. Posso ancora usare questa funzione?
  4. consente di dire che i miei dati sono serial_number_of_student, student_name. In questo caso posso partizionare i miei dati in base a student_name invece del numero di serie ?

risposta

9
  1. Non esattamente. Spark, incluso PySpark, is by default using hash partitioning. Escludendo le chiavi identiche non vi è alcuna somiglianza pratica tra le chiavi assegnate a una singola partizione.
  2. Non c'è una risposta semplice qui. Tutto dipende dalla quantità di dati e risorse disponibili. Too large o un numero troppo basso di partizioni degraderà le prestazioni.

    Some resources reclamare che il numero di partizioni dovrebbe essere circa il doppio del numero di core disponibili. D'altra parte una singola partizione di solito non deve contenere più di 128 MB e un singolo shuffle block non può essere più grande di 2 GB (vedi SPARK-6235).

    Infine, è necessario correggere eventuali scostamenti di dati. Se alcune chiavi sono sovrarappresentate nel set di dati, possono risultare in un utilizzo delle risorse subottimale e in un potenziale errore.

  3. No, o almeno non direttamente. È possibile utilizzare il metodo keyBy per convertire l'RDD nel formato richiesto. Inoltre ogni oggetto Python può essere trattato come una coppia chiave-valore purché implementi i metodi richiesti che lo fanno comportarsi come un Iterable di lunghezza uguale a due. Vedi How to determine if object is a valid key-value pair in PySpark

  4. Dipende dai tipi. Finché la chiave è lavabile * allora sì. In genere significa che deve essere una struttura immutabile e tutti i valori che contiene devono essere immutabili. Ad esempio a list is not a valid key ma è tuple di numeri interi.

Per citare Python glossary:

Un oggetto è hashable se ha un valore hash che non cambia mai durante la sua vita (ha bisogno di un metodo di __hash__()), e può essere paragonato ad altri oggetti (necessita di un metodo __eq__()). Gli oggetti che possono essere confrontati devono avere lo stesso valore di hash.

-1

Recentemente ho usato il partizionamento. Quello che ho fatto è stato di ristrutturare i miei dati in modo che tutti quelli che voglio mettere nella stessa partizione abbiano la stessa chiave, che a sua volta è un valore dai dati. i miei dati erano una lista di dizionari, che ho convertito in tupple con la chiave del dizionario. Inizialmente la partizione non manteneva le stesse chiavi nella stessa partizione. Ma poi ho capito che le chiavi erano stringhe. Li ho trasmessi a int.Ma il problema persisteva. I numeri erano molto grandi. Ho poi mappato questi numeri a piccoli valori numerici e ha funzionato. Quindi il mio take away era che le chiavi devono essere piccoli interi.

+0

Si consiglia di controllare questa risposta, contiene molti refusi. –