微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Spark Dataframe API 选择多个列,将它们映射到固定集,并联合 ALL

如何解决Spark Dataframe API 选择多个列,将它们映射到固定集,并联合 ALL

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

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

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

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

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

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

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

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

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

我可以通过运行 for 循环、选择列并在最后执行 UnionAll 来完成所有这些。但是有没有更好的方法让 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在执行查询时创建计划。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?