【问题标题】:Spark Read JSON with Request ParametersSpark 读取带有请求参数的 JSON
【发布时间】:2020-03-26 18:40:07
【问题描述】:

我正在尝试读取来自 IBM Cloud's DB2 Warehouse documentation 的 JSON 响应。这需要我传递一个请求正文,其中我必须提供 useridpassword 作为请求参数。

要使用spark.read.json 阅读,我没有找到可以提供请求参数的任何内容。无论如何我们可以使用它来做到这一点吗?

通常我会单独使用 Scala 读取 JSON,使用 scalaj-httpplay-json 库,例如:

val body = Json.obj(Constants.KEY_USERID -> userid, Constants.KEY_PASSWORD -> password)

val response = Json.parse(Http(url + Constants.KEY_ENDPOINT_AUTH_TOKENS)
    .header(Constants.KEY_CONTENT_TYPE , "application/json") 
    .header(Constants.KEY_ACCEPT , "application/json")   
    .postData(body.toString())  
    .asString.body)  

我的要求是我不能使用这两个库,必须使用 scalaspark 框架。

【问题讨论】:

  • 尝试查看用于 DB2 developer.ibm.com/hadoop/2017/05/20/… 的 jdbc 连接器。它允许通过选项传递用户名和密码。
  • 我不希望通过 JDBC 进行连接。我的用例要求我使用 REST API 和由此产生的身份验证令牌。要传递凭据,我需要将它们作为标头发送(就像使用 POST 请求时通常那样)但我做到了在 Internet 上找不到任何有助于在调用 spark.read.json 时传递标头的资源

标签: json scala apache-spark apache-spark-sql


【解决方案1】:

您不能将spark.read.json 直接用于 REST API 数据摄取。

首先,发出 API 调用请求以获取响应数据,然后使用 Spark 将其转换为 DataFrame。请注意,如果您的 API 是分页的,那么您需要进行多次调用才能获取所有数据。

对于您的示例,您需要调用身份验证端点以获得Bearer token,然后将其添加到请求标头中:

Authorization: Bearer <your_token>

所有这部分都可以仅使用 Scala 完成(例如 scala.io.Source.fromURL)。

获得response_data 后,使用 spark 将其转换为 DF:

import spark.implicits._
val df = spark.read.json(Seq(response_data).toDS)

【讨论】:

    猜你喜欢
    • 2019-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-07
    • 1970-01-01
    • 2014-02-15
    • 1970-01-01
    • 2019-07-31
    相关资源
    最近更新 更多