【问题标题】:How to stream datasets from a table?如何从表中流式传输数据集?
【发布时间】:2018-03-30 00:52:37
【问题描述】:

我必须使用 spark 将数据从 SQL 服务器表加载到本地文件系统中的 csv。下面是我使用的代码。

val sqlContext = new org.apache.spark.sql.SQLContext(sc)
val jdbcSqlConnStr = "jdbc:sqlserver://HostIP:1433;databaseName=DBName;user=UserName;password=PWD;"
val jdbcDbTable = "dbo.Table"
val jdbcDF = sqlContext.read.format("jdbc").option("url",jdbcSqlConnStr).option("dbtable",jdbcDbTable).load()
jdbcDF.write.format("com.databricks.spark.csv").save("D:\\Spark\\2")

这工作正常。我需要尝试任何其他更好的方法来进一步加快上述方法。

有什么方法可以直接从 sql server 流式传输表并写入文件系统,而不是在内存中存储一​​段时间。这比上面的表现更好吗?如果是,有人可以提供相同的详细信息吗

【问题讨论】:

    标签: apache-spark apache-spark-sql spark-structured-streaming


    【解决方案1】:

    有什么方法可以让我直接从 sql server 流式传输表并写入文件系统,而不是在内存中存储一​​段时间。

    当前版本的 Apache Spark 2.2.0 不直接支持该功能(并且需要一些编码)。

    您可以使用Spark Structured Streaming(这是一个执行结构化查询的模块)并编写一个自定义流Source,它将执行新行获取并创建一个DataFrame进行处理。

    流式源的主要问题是如何跟踪(微批量)执行之间的变化。如果您执行select * from table 并且表格在两者之间发生了变化,您只会得到不同的结果。您必须以某种方式更改(批量)查询以获得正确的结果(例如表状态之间的增量,即当时和现在的行)。这听起来像Change data capture,不是吗?这就是我要看的地方,但 Apache Spark 中不支持开箱即用的东西。

    这几乎需要更改您的代码以使用readStream(而不是read)和自定义格式(使用CDC或其他一些“工具”)。

    【讨论】:

    • 有现成的实现吗?批量转流似乎是一个常见的用例
    • @tribbloid 这个可以为你完成这项工作:github.com/AbsaOSS/Jdbc2S
    猜你喜欢
    • 2021-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多