美文网首页
Spark 如何 post 数据

Spark 如何 post 数据

作者: 学习之术 | 来源:发表于2019-02-16 21:15 被阅读5次
    Photo by Johannes Plenio from Pexels

    有时候,为了方便运营,一个栏位需要配置多种源数据。

    不同数据源的更新方式或频率会有所不同,而且是由不同的人来维护的。

    为了前端接口的简洁性,需要将多种数据汇总到一张表中。

    这种时候,可以选择将数据post到数据接收方,这样就能很方便地汇总多种源数据。

    近来我也碰到这种情况,需要使用Spark将数据post给对方。下面介绍下我的方案。

    第一步:将数据转化为json字符串格式

    先将数据按要求转成Map类型,key与value都需要和数据接收方约定好,不然对方解析数据时就得不到想要的结果。

    假设最终组装好的Map类型数据为x,接着需要将其转化为json字符串类型。

    本文使用json4s工具包,并使用jackson支持,原生的支持在使用时报错,显示java.lang.NoClassDefFoundError: org/json4s/native/Json$

    具体的使用方法如下:

    import org.json4s.jackson.Json
    import org.json4s.DefaultFormats
    
    val jsonData = Json(DefaultFormats).write(x)
    

    第二步:使用httpClient Post数据

    import org.json4s._
    import org.json4s.jackson.JsonMethods._
    import java.net.URI
    import java.nio.charset.StandardCharsets
    import org.apache.commons.io.IOUtils
    import org.apache.http.HttpHeaders
    import org.apache.http.Consts
    import org.apache.http.client.methods.HttpPost
    import org.apache.http.entity.StringEntity
    import org.apache.http.impl.client.HttpClients
    
    val client = HttpClients.createDefault()
    val post = new HttpPost(new URI(你的api))
    post.addHeader(HttpHeaders.CONTENT_TYPE, "application/json")
    
    val entity = new StringEntity(jsonData, Consts.UTF_8.toString)
    entity.setContentEncoding("UTF-8")
    entity.setContentType("application/json")
    
    post.setEntity(entity)
    val resp = client.execute(post) //post数据
    
    // 确保数据已被接收,状态码为200(可能会有不同参考资料)以及result为1
    try {
      val entity = resp.getEntity
      val result: String = IOUtils.toString(entity.getContent, StandardCharsets.UTF_8)
      println(result)
      implicit val formats: DefaultFormats.type = org.json4s.DefaultFormats
      val resultJson: Map[String, Any] = parse(result).extract[Map[String, Any]]
      // 状态异常时发送警报
      if (resultJson.getOrElse("result","-1").toString != "1" || resp.getStatusLine.getStatusCode != 200) {
        Monitor.sendAlarm(WECHAT_ID, APP_NAME, "数据未正常post")
      }
    } finally {
      resp.close()
    }
    

    题外话,搜索关键词非常重要。

    以前没接触过post,所以刚开始试着搜索 spark post、spark http post json data example、spark rest api post json、spark post jsdon data等关键词,但都没找到合适的材料。

    但通过上述找到的资料,大概知道了可能使用httpClient,所以尝试着使用spark HttpClient post搜索,结果在第一页第二条就发现了关键资料(参考文未)。

    所以在搜索时,若是前几页没查到想要的资料,那就得考虑是不是自己的搜索词有问题。

    而且通常情况下,对于编程问题,使用英文搜索词比使用中文更容易查到解决方案。毕竟所有的编程语言都是以拉丁字母,而不是用中文进行编写的。

    需要添加的依赖

    <dependency>
        <groupId>org.json4s</groupId>
        <artifactId>json4s-jackson_2.11</artifactId>
        <version>3.6.4</version>
    </dependency>
    
    <dependency>
        <groupId>org.apache.httpcomponents</groupId>
        <artifactId>httpclient</artifactId>
        <version>4.5.3</version>
    </dependency>
    
    <dependency>
        <groupId>org.apache.httpcomponents</groupId>
        <artifactId>httpasyncclient</artifactId>
        <version>4.1.3</version>
        <exclusions>
            <exclusion>
                <groupId>org.apache.httpcomponents</groupId>
                <artifactId>httpcore</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
    

    参考资料

    1. https://github.com/json4s/json4s/issues/43

    2. https://www.programcreek.com/scala/org.apache.http.client.methods.HttpPost

    3. https://stackoverflow.com/questions/29908297/how-can-i-convert-a-json-string-to-a-scala-map

    4. https://zh.wikipedia.org/wiki/HTTP%E7%8A%B6%E6%80%81%E7%A0%81

    相关文章

      网友评论

          本文标题:Spark 如何 post 数据

          本文链接:https://www.haomeiwen.com/subject/kqnieqtx.html