>

Spark Dataframe df 에 비트가있는 열이 있습니다. . 열은 다음 형식의 문자열입니다.

10001010000000100000000000000000
10001010000000100000000100000000

새 열 "no_of_ones" 를 만드는 간단하고 효과적인 방법이 있습니까?  데이터 프레임을 사용하여 빈도를 계산합니까? RDD 사용 map(lambda x:x.count('1'))  (pyspark). 또한, 위치가있는 목록을 어떻게 검색 할 수 있습니까?

  • 답변 # 1

    내가 생각할 수있는 한 가지 방법은 모든 0을 제거한 다음 필드의 길이를 세는 것입니다.

    df.show
    +--------------------+
    |          bytestring|
    +--------------------+
    |10001010000000100...|
    |10001010000000100...|
    +--------------------+
    
    df.withColumn("no_of_ones" , length(regexp_replace($"bytestring", "0", "")) ).show
    +--------------------+----------+
    |          bytestring|no_of_ones|
    +--------------------+----------+
    |10001010000000100...|         4|
    |10001010000000100...|         5|
    +--------------------+----------+
    
    

  • 답변 # 2

    일반적으로 (py) spark SQL의 미리 정의 된 함수에서 필요한 것을 찾을 수없는 경우 원하는대로 수행하는 UDF (사용자 정의 함수)를 작성할 수 있습니다 (UDF 참조).

    귀하의 경우 새 문자열을 인스턴스화하고 정규식을 컴파일 할 필요가 없기 때문에 잘 코딩 된 udf가 아마도 scala 또는 java의 정규식 솔루션보다 빠를 것입니다 (for 루프가 할 것입니다). 그러나 실행기에서 파이썬 코드를 실행하면 항상 성능이 심각하게 손상되므로 pyspark에서 속도가 훨씬 느려질 수 있습니다.

관련 자료

  • 이전 java - 클래스에서 인터페이스를 만드는 방법
  • 다음 python - 주어진 단어 벡터는 word2vec에서 단어를 얻습니다