首页 > 解决方案 > Spark Dataframe API 选择多个列,将它们映射到一个固定的集合,然后联合所有

问题描述

我有一个定义了此架构的 CSV 源文件。

["Name", "Address", "TaxId", "SS Number", "Mobile Number", "Gender", "LastVisited"]

在这个 CSV 中,这些是我需要做的操作:

  1. 一次选择一个列子集,并将它们全部映射到这个固定模式:

    ["Name", "Address", "Mobile", "UniqueID", "UniqueIdentifierRefCode"]

因此,例如,在第一次迭代中,我将只选择列的一个子集:

[Col("Name"), Col("Address"), Col("Mobile Number"), Col("TaxId"), Lit("TaxIdentifier")]

  1. 在下一次迭代中,我需要选择一个不同的子集,但将它们映射到相同的固定模式:

    [Col("Name"), Col("Address"), Col("Mobile Number"), Col("SS Number"), Lit("SocialSecurityNumber")]

我可以通过运行 for 循环、选择列并最后执行 UnionAll 来完成所有这些操作。但是有没有更好的方法让 Spark 处理这个问题?

标签: .netapache-spark.net-spark

解决方案


您不需要循环,但可以使用联合,如果您将数据框过滤到您想要的行,您可以使用Union- 在我使用的过滤器中,IsNotNull()但您可以使用您喜欢的任何过滤器(如果您不确定在过滤器语法上给我们更多的细节,我会帮忙的)。

var taxId = dataFrame.Filter(Functions.Col("TaxId").IsNotNull())
    .WithColumn("UniqueId", Functions.Col("TaxId"));

var ssId = dataFrame.Filter(Functions.Col("ss").IsNotNull())
    .WithColumn("UniqueId", Functions.Col("ss"));

var unionedDataFrame = taxId.Union(ssId);
unionedDataFrame.Show()

获得最终数据框后,您可以选择实际需要的列或删除不需要的列:

unionedDataFrame.Drop("TaxId").Show()

或者

unionedDataFrame.Select("name, UniqueId").Show()

从逻辑上讲,在 Spark 中,这与以下内容完全相同:

dataFrame.Filter(Functions.Col("TaxId").IsNotNull())
    .WithColumn("UniqueId", Functions.Col("TaxId"))
    .Union( 
      dataFrame.Filter(Functions.Col("ss").IsNotNull())
       .WithColumn("UniqueId", Functions.Col("ss"))
     ).Show()

还要注意,当您调用一个方法时,您会得到一个新的 DataFrame,因此 dataFrame.Filter() 的结果是一个单独的 DataFrame,dataFrame但需要注意的重要一点是,由于延迟评估,Spark 在执行查询时会创建计划.


推荐阅读