2017-01-30 5 views
0

for 루프를 사용하여 값 세트를 반복 할 수있는 것처럼 pySpark를 사용하여 dataframe을 반복해야합니다. 아래는 제가 작성한 코드입니다. 이 코드의 문제는 내가 병렬 pySpark를 사용하여 데이터 프레임의 각 행을 반복하십시오.

  • 나는 일단 funcRowIter
  • 내가 루프를 중단 할 수없는 함수에서 DataFrame에서 모든 값을 인쇄 할 수없는 오전을 중단하는 수집 이용해야

    1. 입니다 일치하는 것을 찾았습니다.

    나는 pySpark에 그것을해야하고이를 위해 팬더를 사용할 수 없습니다

    from pyspark.sql.functions import * 
    from pyspark.sql import HiveContext 
    from pyspark.sql import functions 
    from pyspark.sql import DataFrameWriter 
    from pyspark.sql.readwriter import DataFrameWriter 
    from pyspark import SparkContext 
    
    sc = SparkContext() 
    hive_context = HiveContext(sc) 
    
    tab = hive_context.sql("select * from update_poc.test_table_a") 
    
    tab.registerTempTable("tab") 
    print type(tab) 
    
    df = tab.rdd 
    
    def funcRowIter(rows): 
        print type(rows) 
         if(rows.id == "1"): 
          return 1 
    
    df_1 = df.map(funcRowIter).collect() 
    print df_1 
    
  • 답변

    1

    당신의 목표는 특정 행을 표시 할 것 같다. .filter 다음에 .collect을 사용할 수 있습니다. 예를 들어

    ,

    row_1 = rdd.filter(lambda x: x.id==1).collect() 
    

    그러나, 당신의 dataframe을 통해이 방법을 반복 처리를 시도 할 효율적으로하지 않습니다.

    +0

    내가 수집() 사촌없이이 작업을 수행하려고은 병렬 처리를 중단합니다 수집 매우 큰 데이터에 대한 좋은 옵션이 기록의 수백만 즉 없을 것 –

    0

    df_1 = df.map(funcRowIter).collect()을 사용하는 대신 UDF를 시도해야합니다. 희망이 도움이 될 것입니다.

    from pyspark.sql.functions import struct 
    from pyspark.sql.functions import * 
    def funcRowIter(rows): 
        print type(rows) 
        if(row is nor None and row.id is not None) 
         if(rows.id == "1"): 
          return 1 
    A = udf(funcRowIter, ArrayType(StringType())) 
    z = df.withColumn(data_id, A(struct([df[x] for x in df.columns]))) 
    z.show() 
    

    collect()

    관련 문제