如何有效合并PySpark数据帧?

问题描述 投票:0回答:1

我在Pyspark 2个dataframes已经合并了两天左右。首先是约6000000特征量x 2600行,第二个是约30特征量x 2600行。我怀疑这么久什么正在为前合并火花的实际准备。这里是我的代码:

from pyspark.sql import SQLContext
import pyspark
from pyspark.sql.functions import col, split, create_map, lit
from pyspark.ml import Pipeline
from pyspark.ml.classification import RandomForestClassifier
from pyspark.ml.feature import IndexToString, StringIndexer, VectorIndexer
from pyspark.ml.evaluation import MulticlassClassificationEvaluator

sql_c = SQLContext(sc)

df = sql_c.read.option("maxColumns", 10000000).option("header", "true").options(samplingRatio=0.01).option("inferSchema", "true").csv('join_rows_no_prepended_new_line.csv')

df2 = sql_c.read.option("maxColumns", 10000000).option("header", "true").options(samplingRatio=0.01).option("inferSchema", "true").option("delimiter", "\t").csv('metadata_merged.txt')

#create a new column with a SampleID that matches the SampleID columns from the metadata df.
df = df.withColumn('#SampleID', split(df['# Gene Family'], '\_')[0])

df = df.drop("# Gene Family")
feature_cols = df.columns
df = df.join(df2, col("df.SampleID Gene Family")==col("df2.#SampleID"), how='inner')

最后一行是运行单线程两天的一个。有没有更好的办法在数据准备或别的什么方面为此在Pyspark?

谢谢。

apache-spark merge pyspark apache-spark-sql
1个回答
2
投票
  • 星火SQL是绝对不适合这份工作的合适工具。 由于星火SQL使用关系模型,并优化查询规划,有在列数方面显著的存储和计算开销。下界是线性的(代表模式的成本),但在实践中查询规划的复杂性要高得多,而在最坏的情况下指数。 其结果是星火SQL可以舒适地使用,当列数不超过几千元,但它可以推如有必要,进入下数以万计。数以百万计列的只是没有去。
  • 低效纯文本格式可以说是不适合这份工作的合适工具。
  • 星火ML可能是不适合这份工作的合适工具。 在一般的参考火花ML算法可以在宽组装的数据合理地运行良好,只要该数据是稀疏的。没有足够的信息有问题,以确定这种情况或没有。 在一些情况下widish数据可以在火花处理,但它需要较低级别的优化(聪明编码,使用较低精度的数值)中比在火花ML可用。
  • 星火一般可能会或可能不会是这个职位的合适的工具。 内置的功能和常用的包假设您使用的数据是漫长的,(相对)较窄*,并且将无法正常工作,如果在所有,具有非常宽的数据。它可以解决与用户的读取器逻辑,以及自定义算法,但它是不是你会得到外的开箱,并根据问题,寻找一个可扩展的解决方案可能具有挑战性。

这些问题的一部分可以很容易地处理(例如回落至RDD API来加载,解析和组装数据应涉及优化的瓶颈),其他可能要求对工作显著量(与短数据的功能子集整体模型可以高效的进行培训平行,只要可以确保到数据有效的选择性访问)。现在的问题是,如果真的是值得的 - 什么能不能在内存中的中档服务器上处理 - 数据尺寸的数据范围内的某处100GB建议。


*那当然是不特定的火花。分布式处理工具大多默认情况下在那里做类似的假设。

© www.soinside.com 2019 - 2024. All rights reserved.