.net—spark dataframe api,用于选择多个列,将它们Map到一个固定集,然后合并所有列

xesrikrc  于 2021-07-12  发布在  Spark
关注(0)|答案(1)|浏览(271)

我有一个定义了这个模式的csv源文件。 ["Name", "Address", "TaxId", "SS Number", "Mobile Number", "Gender", "LastVisited"] 从这个csv中,我需要执行以下操作:
一次选择一个列子集,并将所有列Map到此固定架构: ["Name", "Address", "Mobile", "UniqueID", "UniqueIdentifierRefCode"] 例如,在第一次迭代中,我将只选择列的一个子集: [Col("Name"), Col("Address"), Col("Mobile Number"), Col("TaxId"), Lit("TaxIdentifier")] 在下一次迭代中,我需要选择不同的子集,但要将它们Map到相同的固定模式: [Col("Name"), Col("Address"), Col("Mobile Number"), Col("SS Number"), Lit("SocialSecurityNumber")] 我可以通过运行for循环、选择列并最终执行unionall来完成所有这些。但是有没有更好的方法让spark来处理这个问题呢?

dfddblmv

dfddblmv1#

您不需要循环,但可以使用联合,如果您将Dataframe过滤到所需的行,则可以使用 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()

获得最终Dataframe后,可以选择实际需要的列,也可以删除不需要的列:

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在执行查询时会创建计划。

相关问题