【问题标题】:How to split data vertically instead of horizontally?如何垂直分割数据而不是水平分割?
【发布时间】:2017-01-21 20:00:20
【问题描述】:

我想集群和拆分(使用 Hadoop)具有大约 60K 特征(维度也称为列)的数据集。这个数据集的实例很少——大约 100 行。我不想水平拆分数据,而是想根据特征集群进行拆分。例如,如果我有 3 个集群,我希望每个集群有 20K 列和 100 行,以便在 3 个不同的节点上运行。

如何实现这种拆分?如果做不到这一点,您能否为 Hadoop 以外的框架提供任何建议来促进这种拆分?

【问题讨论】:

  • 你打算对你的数据集执行什么样的操作?要执行的操作是按列操作,并且您不需要同一个映射器中的完整记录(行)吗?您的数据集以什么格式提供?
  • 数据集为 csv 格式。是的,这些操作就像找到一个特征的熵,所以它是按列的,我不需要在同一个映射器中的完整记录。
  • Parquet 文件格式可能对您有所帮助。它具有柱状存储布局。 Mapreduce 作业可以从同一列读取特定列并从同一列应用操作。你可以谷歌了解更多
  • 收紧措辞。
  • 转置 csv 是否适合您?

标签: hadoop mapreduce distributed


【解决方案1】:

首先:对于这个tiny 数据集(60k*100 即几兆字节),MapReduce 是一个非常糟糕的选择。您将获得大量开销,而收益为零。 如果您的数据适合主内存,请不要使用 Hadoop! 甚至 Excel 也会更快。

除此之外,您显然可以通过映射切换行和列标识符从行存储转换为列存储:

def map(key, row):
    for column, value in row:
        send( column, (key, value) )

【讨论】:

  • 我在某处读到,hadoop 用于数据并行化,而多线程用于进程并行化。我必须将数据分成 3 个部分,并在 3 个部分上应用相同的算法。为了减少我想在hadoop上做的总时间。我可以将多线程用于相同的(用于数据并行化)吗??...或者其他可能的选择是什么?
猜你喜欢
  • 2011-08-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-28
  • 2019-04-26
  • 1970-01-01
相关资源
最近更新 更多