如何在 Scala/Spark 中从多个 DataFrame 创建包含多个工作表的 Excel 文件?

2024-01-09

In Scala/Spark应用程序我创建了两个不同的DataFrame。我的任务是为每个 DataFrame 创建一个包含两个工作表的 Excel 文件。

我决定使用火花Excel https://github.com/crealytics/spark-excel图书馆,但我有点困惑。据我了解,未来的excel文件保存在hdfs文件系统中,对吗?我需要设置未来excel文件的路径.save()方法对吧?我也不明白应该采用什么格式dataAddress option?

import org.apache.spark.sql.Dataset
import spark.implicits._

val df1 = Seq(
    ("2019-01-01 00:00:00", "7056589658"),
    ("2019-02-02 00:00:00", "7778965896")
).toDF("DATE_TIME", "PHONE_NUMBER")

df1.show()

val df2 = Seq(
    ("2019-01-01 01:00:00", "194.67.45.126"),
    ("2019-02-02 00:00:00", "102.85.62.100"),
    ("2019-03-03 03:00:00", "102.85.62.100")
).toDF("DATE_TIME", "IP")

df2.show()

df1.write
    .format("com.crealytics.spark.excel")
    .option("dataAddress", "'First'!A1:B1000")
    .option("useHeader", "true")
    .mode("append")
    .save("/hdd/home/NNogerbek/data.xlsx")

df2.write
    .format("com.crealytics.spark.excel")
    .option("dataAddress", "'Second'!A1:B1000")
    .option("useHeader", "true")
    .mode("append")
    .save("/hdd/home/NNogerbek/data.xlsx")

首先,这是Maven依赖 https://mvnrepository.com/artifact/com.crealytics/spark-excel_2.11/0.12.0 I used

<!-- https://mvnrepository.com/artifact/com.crealytics/spark-excel -->
<dependency>
    <groupId>com.crealytics</groupId>
    <artifactId>spark-excel_2.11</artifactId>
    <version>0.12.0</version>
</dependency>

问题:据我了解,未来的excel文件保存在hdfs文件系统中,对吧?我需要设定未来的道路 .save() 方法中的 excel 文件,对吧?我也不懂什么 格式应该在 dataAddress 选项中吗?


什么是数据地址? 来自文档

数据地址: https://github.com/crealytics/spark-excel#data-addresses的位置 可以使用 dataAddress 选项指定要读取或写入的数据。 目前支持以下地址样式:

B3:数据的起始单元格。读取将返回下面的所有行以及所有 右侧的列。写作将从这里开始并使用尽可能多的栏目 和所需的行。 B3:F35:数据单元格范围。读书会回来 仅指定范围内的行和列。写作将开始于 第一个单元格(本例中为 B3)并仅使用指定的列 和行。如果 DataFrame 中有更多行或列要写入, 它们将被截断。确保这是您想要的。 '我的 Sheet'!B3:F35:与上面相同,但使用特定的工作表。 MyTable[#All]:数据表。读取将返回所有行和列 在此表中。写入时只会在当前范围内写入 桌子。不会执行表的增长


所以 "My Sheet1'!B3:C35" 意味着您正在告诉 api...我的 Sheet1 和 B3:C35

excel工作表中的列位置..

下面是我实现期望的完整列表。


package com.examples

import org.apache.log4j.{Level, Logger}
import org.apache.spark.sql.SparkSession

object ExcelTest {
  def main(args: Array[String]) {
    import org.apache.spark.sql.functions._
    Logger.getLogger("org").setLevel(Level.OFF)

    val spark = SparkSession.builder.
      master("local")
      .appName(this.getClass.getName)
      .getOrCreate()
    import spark.implicits._
    val df1 = Seq(
      ("2019-01-01 00:00:00", "7056589658"),
      ("2019-02-02 00:00:00", "7778965896")
    ).toDF("DATE_TIME", "PHONE_NUMBER")

    df1.show()

    val df2 = Seq(
      ("2019-01-01 01:00:00", "194.67.45.126"),
      ("2019-02-02 00:00:00", "102.85.62.100"),
      ("2019-03-03 03:00:00", "102.85.62.100")
    ).toDF("DATE_TIME", "IP")

    df2.show()

    df1.coalesce(1).write
      .format("com.crealytics.spark.excel")
      .option("dataAddress", "'My Sheet1'!B3:C35")
      .option("useHeader", "true")
      .option("dateFormat", "yy-mmm-d")
      .option("timestampFormat", "mm-dd-yyyy hh:mm:ss")
      .mode("append")
      .save(".\\src\\main\\resources\\testexcel.xlsx")

    df2.coalesce(1).write
      .format("com.crealytics.spark.excel")
      .option("dataAddress", "'My Sheet2'!B3:C35")
      .option("useHeader", "true")
      .option("dateFormat", "yy-mmm-d")
      .option("timestampFormat", "mm-dd-yyyy hh:mm:ss")
      .mode("append")
      .save(".\\src\\main\\resources\\testexcel.xlsx")
  }
}

注意:.coalesce(1) 将创建单个文件而不是多个部分文件...

结果:由于我使用本地结果,如果它的纱线将保存在 hdfs 中,结果将保存在本地。如果你想使用像s3这样的云存储,也可以使用yarn作为master。基本上这是根据你的要求...

表 1:


表2:

还, 1)看我的文章如何使用 Apache Spark Scala 使用 Excel 工作表进行简单报告? https://www.linkedin.com/pulse/how-do-simple-reporting-excel-sheets-using-apache-spark-ghadiyaram/
2)看我的回答here. https://stackoverflow.com/a/47827565/647053
希望有帮助!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 Scala/Spark 中从多个 DataFrame 创建包含多个工作表的 Excel 文件? 的相关文章

随机推荐

  • 转换播放!从 MySQL 到 PostgreSQL 的框架演变

    我正在使用 plaframework 2 2 1 我做了一个项目 MySQL 但现在我想将我的项目转移到 PostgreSQL 但在重新创建数据库演变时遇到了一些错误 我的 mysql 的旧演变 1 sql 运行良好是 Created by
  • 如何设置绑定到Textbox的Label的可见性?

    我有三个绑定到标签的文本框 当我在文本框中键入内容时 文本框文本值将设置为标签 问题是我想在文本框为空白时将标签的可见性设置为折叠 反之亦然 如何在 WPF 中使用 Visibility Convert 来做到这一点 在 XAML 文件中
  • Angular2 使用 @Inputs 和 s

    我的页面中有一个子导航 它在公共主视图下方显示一些子视图 我想通过将一个对象传递给子视图
  • 查找两个列表中都不存在的对象的最佳方法

    我正在开发一个模块 该模块依赖于检查两个列表中是否存在不存在的任何对象 该实现应该是用Python 实现的 考虑简化的对象 def class Foo object def init self attr one None attr two
  • 使用带有 Font Awesome 的数字

    我想使用数字列出流程中的步骤 我很好奇如何使用 Font Awesome 来做到这一点 我想使用带有 1 2 3 的圆圈 这可能吗 Font Awesome 会在图标列表中添加数字吗 Thanks 字体真棒实际上有内置支持 https fo
  • Android 工作室:NoClassDefFoundError 与 java.util.Base64

    抱歉 我扫描了许多听起来相似的问题 但没有一个对我有帮助 我正在运行 Android Studio 3 0 1 我是新手 我正在遵循在线教程 HelloWorld 程序 但随后添加了对 java util Base64 getDecoder
  • 运算符 new 将内存初始化为零

    有这样的代码 include
  • 如何在 Android 中将 ImageButton 与背景图像正确对齐?

    在使用 XML 的 Android UI 设计中 如何将 ImageButton 与 Activity xml 文件的背景完全对齐 假设我有两张图像 一张用作活动的背景图像 第二张用作图像按钮源 这是背景图像 https i stack i
  • 如何在 Python 中获得人类可读的时区名称?

    在我正在从事的一个Python项目中 我希望能够获得以下形式的 人类可读 时区名称美洲 纽约 对应系统本地时区 显示给用户 我见过的每一段访问时区信息的代码都只返回数字偏移量 0400 或字母代码 EDT 有时两者都返回 是否有一些 Pyt
  • NEAT 错误 - AttributeError:“tuple”对象没有属性“connections”

    我目前正在尝试创建一个 NEAT 算法来解决 FlappyBird 但在运行我的代码时遇到错误 参见标题 目前我已经设置了我的run功能和我的eval genomes功能 我已经简化了它们以删除pygame并试图将其保留在neat pyth
  • 如何使用vba禁用单元格中的更改?

    我正在使用以下代码 此代码的示例如下 如果我在单元格 A1 中输入任何值 单元格 B1 将显示时间戳 Private Sub Worksheet Change ByVal Target As Excel Range With Target
  • “单例”工厂,好还是坏?

    我有很多 抽象 工厂 它们通常作为单例实现 通常是为了方便 不必将它们传递给实际上与使用或了解这些工厂无关的层 大多数时候我只需要在启动时决定哪个工厂实现其余的代码程序 也许通过一些配置 它看起来例如喜欢 abstract class Co
  • 使用 Mips Assembly 读取和打印 txt 文件中的内容

    我正在尝试读取并打印 txt 文件中的内容 稍后我还想从 mips 读取转储的文件 我看到代码 看起来没问题 但没有输出任何内容 data myFile asciiz teste txt filename for input buffer
  • 从 RecyclerView 中删除行

    我在这篇文章的帮助下以某种方式实现了 recyclerview 现在我的要求是在运行时从此回收视图中删除一行 link http treyrobinson net blog android l tutorials part 3 recycl
  • 首先使用 Entity Framework 6.0 代码创建与 LINQPad 的 DbContext 连接时出现问题

    我正在使用 LINQPad v4 51 03 并尝试从 Entity Framework 6 0 6 1 1 中的代码优先实现创建 DbContext 连接 public partial class MyEntities DbContext
  • Google Apps 脚本 - 单元格中的 .setValue 基于 for 循环匹配

    我试图从数据范围中获取值 循环数据 匹配该数据中的值 然后根据匹配值更新位于几列上方的单元格 我能够找到要匹配的值 但我很难理解如何更新几列的单元格 下面是我到目前为止得到的代码 减去 setValue 部分 var trackingSS
  • 数据表中的条件差异计算

    我有一百万行长data table大约有20个柜台式的柱子 这些列显示各种存储系统操作的计数器随时间的增加 然而 有时 受监控系统上的计数器会重置 并且单个观测值低于前一个观测值 我需要计算一个opsdiff列 其中包含基于列的相同类型的后
  • iOS MKMapView 缩放以显示所有标记

    我正在与MKMapView并在地图上标出了几个点 我已经用过MKCoordinateRegion and MKCoordinateSpan围绕其中一个点启用缩放等 但这不是我想要的 我正在尝试使用类似于 Javascript 缩放到边界功能
  • 如何在 Go 中编写多行字符串?

    Go 是否有类似于 Python 的多行字符串的东西 line 1 line 2 line 3 如果不是 那么编写跨多行字符串的首选方式是什么 根据语言规范 http golang org doc go spec html String l
  • 如何在 Scala/Spark 中从多个 DataFrame 创建包含多个工作表的 Excel 文件?

    In Scala Spark应用程序我创建了两个不同的DataFrame 我的任务是为每个 DataFrame 创建一个包含两个工作表的 Excel 文件 我决定使用火花Excel https github com crealytics s