>source

Spark에는 m 개의 행과 n 개의 열이있는 데이터 프레임 (df1)이 있습니다. 1 행과 n 열이있는 다른 데이터 프레임 (df2)이 있습니다. df2의 단일 행으로 df1의 각 행의 내적을 어떻게 효율적으로 계산할 수 있습니까?

  • 답변 # 1

    VectorAssembler를 사용하여 내적을 수행 할 수 있습니다.

      샘플 데이터 프레임 생성 :

      from pyspark.ml.linalg import Vectors, DenseVector
      from pyspark.sql import functions as F
      from pyspark.ml.feature import VectorAssembler
      from pyspark.sql.types import *
      v = [('a', 1,2,3),
          ('b', 4,5,6),
          ('c', 9,8,7)]
      df1 = spark.createDataFrame(v, ['id', 'v1', 'v2', 'v3'])
      df2 = spark.createDataFrame([('d',3,2,1)], ['id', 'v1', 'v2', 'v3'])
      df1.show()
      df2.show()
      
      

      다음과 같이 보입니다 :

      +---+---+---+---+
      | id| v1| v2| v3|
      +---+---+---+---+
      |  a|  1|  2|  3|
      |  b|  4|  5|  6|
      |  c|  9|  8|  7|
      +---+---+---+---+
      +---+---+---+---+
      | id| v1| v2| v3|
      +---+---+---+---+
      |  d|  3|  2|  1|
      +---+---+---+---+
      
      
      

      VectorAssembler 사용  열을 Vector 로 변환

      vecAssembler = VectorAssembler(inputCols=["v1", "v2", "v3"], outputCol="values")
      dfv1 = vecAssembler.transform(df1) 
      dfv2 = vecAssembler.transform(df2)
      dfv1.show()
      dfv2.show()
      
      

      이제 다음과 같이 보입니다 :

      +---+---+---+---+-------------+
      | id| v1| v2| v3|       values|
      +---+---+---+---+-------------+
      |  a|  1|  2|  3|[1.0,2.0,3.0]|
      |  b|  4|  5|  6|[4.0,5.0,6.0]|
      |  c|  9|  8|  7|[9.0,8.0,7.0]|
      +---+---+---+---+-------------+
      +---+---+---+---+-------------+
      | id| v1| v2| v3|       values|
      +---+---+---+---+-------------+
      |  d|  3|  2|  1|[3.0,2.0,1.0]|
      +---+---+---+---+-------------+
      
      
      

      를 정의 udf  내적을하기 위해

      # Get the fixed vector from DataFrame dfv2
      vm = Vectors.dense(dfv2.take(1)[0]['values'])
      dot_prod_udf = F.udf(lambda v: float(v.dot(vm)), FloatType())
      dfv1 = dfv1.withColumn('dot_prod', dot_prod_udf('values'))
      dfv1.show()
      
      

      최종 결과 :

      +---+---+---+---+-------------+--------+
      | id| v1| v2| v3|       values|dot_prod|
      +---+---+---+---+-------------+--------+
      |  a|  1|  2|  3|[1.0,2.0,3.0]|    10.0|
      |  b|  4|  5|  6|[4.0,5.0,6.0]|    28.0|
      |  c|  9|  8|  7|[9.0,8.0,7.0]|    50.0|
      +---+---+---+---+-------------+--------+
      
      
      

관련 자료

  • 이전 python - 분석을 위해 동일한 축에서 서로 다른 세 기간의 x/y 데이터 포인트를 플롯하려면 어떻게해야합니까?
  • 다음 python - 팬더 데이터 프레임의 여러 파이 차트