>

열이 40 개 이상인 스파크 데이터 프레임이 있습니다. 그리고 수백만 행. 위의 데이터 프레임에서 5 열을 취하는 다른 열을 만들고 싶습니다 .5 열의 각 행을 별도의 Api (이 5 값을 가져 와서 일부 데이터를 반환)에 전달하고 결과를 열에 저장하려고합니다.

간단하게하기 위해 다음 예제를 사용합니다. 다음 데이터 프레임이 있다고 가정 해보십시오. 그리고 "food"와 "price"의 각 행을 API로 보내 결과를 반환하고 "combine"이라는 별도의 열에 저장됩니다

입력 :

+----+------+-----+
|name|food  |price|
+----+------+-----+
|john|tomato|1.99 |
|john|carrot|0.45 |
|bill|apple |0.99 |
|john|banana|1.29 |
|bill|taco  |2.59 |
+----+------+-----+

출력 :

+----+------+-----+----------+
|name|food  |price|combined  |
+----+------+-----+----------+
|john|tomato|1.99 |abcd      |
|john|carrot|0.45 |fdg       |
|bill|apple |0.99 |123fgfg   |
|john|banana|1.29 |fgfg4wf   |
|bill|taco  |2.59 |gfg45gn   |
+----+------+-----+----------+

각 행을보기 위해 UDF를 만들었습니다 :

val zip = udf {
(food: String, price: Double) =>
    val nvIn = new NameValue
    nvIn.put("Query.ID", 1234)
    nvIn.put("Food", food)
    nvIn.put("Price", price)
    val nvOut = new NameValue
    val code: Code = getTunnelsClient().execute("CombineData", nvIn, nvOut) // this is calling the external API
    nvOut.get("CombineData")     //this is stored the result column
  }
  def test(sc: SparkContext, sqlContext: SQLContext): Unit = {
    import sqlContext.implicits._
    val df = Seq(
      ("john", "tomato", 1.99),
      ("john", "carrot", 0.45),
      ("bill", "apple", 0.99),
      ("john", "banana", 1.29),
      ("bill", "taco", 2.59)
    ).toDF("name", "food", "price")

    val result = df.withColumn("combined", zip($"food", $"price"))
    result.show(false)
  }

이 방법은 효과가 있지만 데이터 프레임의 각 행을보고 있기 때문에 걱정이되고 수백만 개의 행이 있으므로 클러스터에서 성능이 떨어집니다

udf를 사용하지 않고 다른 방법으로 스파크 -SQL을 사용할 수 있습니까?


  • 답변 # 1

    안전한 spark 형식을 사용하는 것이 좋습니다.  와이즈 비즈  API를 사용하여 데이터 행을 API로 보냅니다.

    이것은 당신의 Dataset 파싱을 포함합니다   Dataframe 에 행  와이즈 비즈  와이즈 비즈   scala 를 사용하여  기능과 case 실행  당신의 class 에 기능  그것을 API로 보내고 다른 as 를 반환  당신의 map 를 나타내는 .

    Dataset\Dataframe 를 엄격히 따르지는 않지만   case class 를 사용하여  api를 사용하면 Output 에서 제공되는 대부분의 최적화를 활용할 수 있습니다  

    spark sql
    
    
    Dataset

관련 자료

  • 이전 azure active directory - loginmicrosoftonlinecom 도메인에서 Javascript (script) 태그를 사용할 수 없습니다
  • 다음 swift - 아래에서 위로 UIView 전환 문제