복붙노트

[SCALA] 개의 행의 값을 추출하는 스파크

SCALA

개의 행의 값을 추출하는 스파크

나는 다음과 같은 dataframe을

val transactions_with_counts = sqlContext.sql(
  """SELECT user_id AS user_id, category_id AS category_id,
  COUNT(category_id) FROM transactions GROUP BY user_id, category_id""")

나는 평가 개체에 대한 행을 변환하는 것을 시도하고 있지만, x는 (0) 배열을 반환하기 때문에이 실패

val ratings = transactions_with_counts
  .map(x => Rating(x(0).toInt, x(1).toInt, x(2).toInt))

해결법

  1. ==============================

    1.일부 더미 데이터로 시작하자 :

    일부 더미 데이터로 시작하자 :

    val transactions = Seq((1, 2), (1, 4), (2, 3)).toDF("user_id", "category_id")
    
    val transactions_with_counts = transactions
      .groupBy($"user_id", $"category_id")
      .count
    
    transactions_with_counts.printSchema
    
    // root
    // |-- user_id: integer (nullable = false)
    // |-- category_id: integer (nullable = false)
    // |-- count: long (nullable = false)
    

    행 값에 액세스 예상 유형을 유지하는 몇 가지 방법이 있습니다 :

  2. ==============================

    2.다음과 같이 등급을 정의 할 수 있습니다 데이터 세트를 사용하여 :

    다음과 같이 등급을 정의 할 수 있습니다 데이터 세트를 사용하여 :

    case class Rating(user_id: Int, category_id:Int, count:Long)
    

    평가 클래스는 여기에 대신 zero323 제안으로 '평가'의 열 이름 '수'를 가지고있다. 다음과 같이 따라서 평가 변수는 할당됩니다

    val transactions_with_counts = transactions.groupBy($"user_id", $"category_id").count
    
    val rating = transactions_with_counts.as[Rating]
    

    당신이 불꽃에 런타임 오류로 실행되지 않습니다이 방법은 당신을 때문에 평가 클래스 열 이름은 런타임에 스파크에 의해 생성 된 '수'열 이름과 동일합니다.

  3. ==============================

    3.Dataframe의 행의 값에 액세스하려면, 당신은 루프와 Dataframe의 rdd.collect을 사용해야합니다.

    Dataframe의 행의 값에 액세스하려면, 당신은 루프와 Dataframe의 rdd.collect을 사용해야합니다.

    당신의 Dataframe 아래처럼 보이는 것이 좋습니다.

    val df = Seq(
          (1,"James"),    
          (2,"Albert"),
          (3,"Pete")).toDF("user_id","name")
    

    당신의 Dataframe 위에 rdd.collect 사용합니다. 행 변수는 RDD 행 유형의 Dataframe의 각 행을 포함합니다. 행의 각각의 요소를 얻으려면, 콤마로 분리 각 행의 값을 포함 할 것이다 ( ",")를 사용 row.mkString. 분할 기능 (붙박이 기능)를 사용하면 인덱스와 RDD 행의 각 열 값에 액세스 할 수 있습니다.

    for (row <- df.rdd.collect)
    {   
        var user_id = row.mkString(",").split(",")(0)
        var category_id = row.mkString(",").split(",")(1)       
    }
    

    위의 코드는 좀 더 큰 dataframe.foreach 루프에 비해 보이지만, 당신은 위의 코드를 사용하여 논리를보다 효율적으로 관리를 받게됩니다.

  4. from https://stackoverflow.com/questions/33007840/spark-extracting-values-from-a-row by cc-by-sa and MIT license