pyspark學習筆記


記錄一些pyspark常用的用法,用到的就會加進來

pyspark指定分區個數

通過spark指定最終存儲文件的個數,以解決例如小文件的問題,比hive方便,直觀
有兩種方法,repartition,coalesce,並且,這兩個方法針對RDD和DataFrame都有
repartition和coalesce的區別:
repartition(numPartitions:Int):RDD[T]
coalesce(numPartitions:Int,shuffle:Boolean=false):RDD[T]
他們兩個都是RDD的分區進行重新划分,repartition只是coalesce接口中shuffle為true的簡易實現,(假設RDD有N個分區,需要重新划分成M個分區)

  • N<M。一般情況下N個分區有數據分布不均勻的狀況,利用HashPartitioner函數將數據重新分區為M個,這時需要將shuffle設置為true。
  • 如果N>M並且N和M相差不多,(假如N是1000,M是100)那么就可以將N個分區中的若干個分區合並成一個新的分區,最終合並為M個分區,這時可以將shuff設置為false,在shuffle為false的情況下,如果M>N時,coalesce為無效的,不進行shuffle過程,父RDD和子RDD之間是窄依賴關系。
  • 如果N>M並且兩者相差懸殊,這時如果將shuffle設置為false,父子RDD是窄依賴關系,他們同處在一個stage中,就可能造成spark程序的並行度不夠,從而影響性能,如果在M為1的時候,為了使coalesce之前的操作有更好的並行度,可以講shuffle設置為true。
    具體用法:
   rdd.repartition(1)
   rdd.coalesce(1)
   df = spark.sql('select * from test')
   df.repartition(1)
   df.repartition(5,col("name")).coalesce(2)

hive-sql與spark-sql中union all 的不同

在hive-sql中,如果字段類型為map<string,string>,那么union all上下兩個表中,如果有要表示空的map,必須使用map(null,null)這種方式,事實上,還是一個map對象
但是在spark-sql中,如果有要表示空的map,就不能直接用map(null,null)了,應該直接賦值null,本質上,是一個null值,而不是map對象


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM