python explode函数,spark posexplode函数运行非常快

博客作者通过对比Spark中RDD和DataFrame处理ORC文件的性能,发现RDD在单个CPU核心上的表现优于DataFrame,但整体速度仍然较慢。他们通过调整代码,使用prestoDB查询替代Spark,显著提高了处理速度,达到每秒超过1行,相比DataFrame提升了20倍,比RDD快4倍。这表明在某些场景下,选择合适的查询工具对于大数据处理至关重要。
摘要由CSDN通过智能技术生成

看来斯帕克对这里的这些行做了些疯狂的事。使用RDDs,我可以获得更好的性能(每个CPU内核每秒1/3行,而数据帧的每个CPU核心每秒1/40行)。但这仍然不是很快。在df = sql_context.read.orc('/path/to/source/file')

rdd = df.rdd

def expand(row):

contig, start, ref, alt, gt = row

def getrow(index, genotype):

return contig, start, ref, alt, index, genotype

return [getrow(index, genotype) for index, genotype in enumerate(gt)]

rdd_flat = rdd.flatMap(expand)

schema = ('contig', 'start', 'ref', 'alt', 'index', 'genotype')

sqlc.createDataFrame(rdd_flat, schema=schema).write.orc('/path/to/output/file')

有趣的是如果我把扩展函数重新定义为

^{pr2}$

它的运行速度大约慢13倍(一个函数调用大约需要1.4秒)。在

很明显,row对象的效率非常低。在

不过,还有更多的问题需要解决。单个核心应该能够每秒运行扩展函数9次,但实际性能是每3秒运行1行。在

编辑:找到一个“解决方案”:使用prestodb查询而不是spark。它以每秒超过1行的速度运行,比数据帧快20倍,比RDD快4倍:create table flat (

contig varchar,

start int,

ref varchar,

alt varchar,

index bigint,

genotype tinyint

)

WITH (format = 'ORC');

insert into flat

select contig, start, ref, alt, index, genotype, partition_name

from nested cross join unnest(gt) with ordinality as g (genotype, index)

where partition_name='10-70329347';

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值