辛德蕾拉|SparkSQL /DataFrame /Spark RDD谁快?( 二 )
酷暑让人思想活跃 , 思绪万千 。 扯得有点远了 , 重来
不重来了 , 接着写bug 。
作为一个谨记厕所文化的人 , 蹲坑5分钟 , 方便你我他;蹲坑半小时 , 痔疮等着你 。 我选择了后者 。
半小时过去了 , 时间随着大A股的大跌 , 瞬间来到了下午的收盘时间 。 果不其然 , 又一个下跌如期而至 , 就在这一刻 , 体内的混浊之气伴着伴随着收跌的股市排出体外 。 收拾干净后 , 我带着满身厕所的芬芳 , 回到了座位上 。
再次打开电脑屏幕 , spark任务还在慢悠悠的读取json文件 , 半小时才读取300G左右 , 10T的json文件按照这个速度 , 全部读完的好几天 。 此方案不可用 。
方案二
果断改成RDD , 然后用intersection求交集 , 果然快很多 , 10T跟50G求交集 , 12000cores , 5分钟出结果 。 Spark任务提交同方案一 , 不再赘述 。 此方案可行
屁颠屁颠的把结果交付给需求方 , 大佬甚是满意地流出了开心的泪水
import jsonfrom pyspark.sql import SparkSessiondef join_it():path_json = 'hdfs://i/love/you/'# 数据大小10T, 5万分区path_csv= 'hdfs://you/love/me'# 数据大小50Gpath_save = 'hdfs://we/are/together'#rdd1 = sc.textFile(path_json).map(lambda v: json.loads(v).get('url', '')).coalesce(50000)rdd2 = sc.textFile(path_csv).map(lambda v: v.split('\t')[1])rdd1.intersection(rdd2).coalesce(20000).saveAsTextFile(path_save)if __name__ == '__main__':spark = SparkSession.builder.appName('pyspark').getOrCreate()sc = spark.sparkContextsc.setLogLevel("ERROR")#join_it()#spark.stop()
方案三
离下班实际还有30分钟 , 作为一个对技术有追求的资深码农 , 尝试用SparkSQL实现该功能 。 祭出代码 , 以资各位看官共享 , 新能跟RDD不相上下 。 此方案也可取 。
import jsonfrom pyspark.sql import SparkSessiondef join_it():path_json = 'hdfs://i/love/you/'# 数据大小10T, 5万分区path_csv= 'hdfs://you/love/me'# 数据大小50Gpath_save = 'hdfs://we/are/together'#sc.textFile(path_json).map(lambda v: (json.loads(v).get('url', ''),)).toDF(['url']).createOrReplaceTempView('a')spark.read.option('sep', '\t').schema('name string, url string').select('url').csv(path_csv).createOrReplaceTempView('b')sql = '''SELECTa.urlFROMaJOINbONa.url=b.url'''spark.sql(sql).coalesce(20000).write.mode('overwrite').option('sep', '\t').csv(path_save)if __name__ == '__main__':spark = SparkSession.builder.appName('pyspark').getOrCreate()sc = spark.sparkContextsc.setLogLevel("ERROR")#join_it()#spark.stop()
总结:
当遇到源数据是体量比较大的json或其他格式的时候 , 不要用spark.read的形式直接导入到DataFrame 。
那要咋弄?可以先用RDD把源数据加载进来 , 然后再转化成DataFrame , 后面用SparkSQL进行操作 , 如此可达到较好的性能效果 。
推荐阅读
- 辛德蕾拉|简单好用的电脑录屏软件,自媒体或日常使用必备,内附破解注册机
- 辛德蕾拉|华为手机,荣耀手机2020年9月3日批发报价
- 英雄联盟|云顶S3,星守女团十连胜吃鸡!锤海盗灭狙神,辛德拉点名秒杀
- 辛德蕾拉|博文科技公司获得“360推广”2018年最具影响力奖
- 辛德蕾拉|百世集团首次实现跨境电商“9710”出口业务落地
- 辛德蕾拉|干货丨“杜比音效”是什么?如何通俗的理解?
- 辛德蕾拉|设计师打造最简洁、精致Win10桌面 用户:微软快好好借鉴
- 辛德蕾拉|P2P平台大清理,究竟谁之幸?
- 辛德蕾拉|华为Mate40系列抢先看:机皇配置,价格升级,或成谢幕绝唱
- 辛德蕾拉|中国芯要崛起,单靠华为肯定是不行的,必须要学会打“群架”
