2017-05-22 8 views
1

을 변환하는 데 시간이 너무 오래 :스파크 파이썬 : sortBy는 ValueError를 일으키는 : 유니 코드 플로트() 문자 나는 RDD이처럼 보이는이

rdd.take(2) 

(ID, 평균 등급)

[(u'1269', 433355525.39999998), (u'1524', 5693044.25)] ...

I 기능별로 정렬하려고합니다. sortBy()

sorted = rdd.sortBy(lambda x: x[1]) 

반환해야합니다. 정렬 된 ID 목록. 내가 대신 다음과 같은 오류를 받고 있어요 :

ValueError: Unicode float() literal too long to convert

at org.apache.spark.api.python.PythonRunner$$anon$1.read(PythonRDD.scala:166) 
    at org.apache.spark.api.python.PythonRunner$$anon$1.<init>(PythonRDD.scala:207) 
    at org.apache.spark.api.python.PythonRunner.compute(PythonRDD.scala:125) 
    at org.apache.spark.api.python.PythonRDD.compute(PythonRDD.scala:70) 
    at org.apache.spark.rdd.RDD.computeOrReadCheckpoint(RDD.scala:313) 
    at org.apache.spark.rdd.RDD.iterator(RDD.scala:277) 
    at org.apache.spark.scheduler.ResultTask.runTask(ResultTask.scala:66) 
    at org.apache.spark.scheduler.Task.run(Task.scala:89) 
    at org.apache.spark.executor.Executor$TaskRunner.run(Executor.scala:227) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
    ... 1 more 

나는 피곤 다시 유니 코드로 플로트 값을 변환 할, 뒤로 할 수 있습니다. 나는

[(u'1269', 433355525.0), (u'1524', 5693044.0)]

은 아마 진수 해결책이 될 것이다 사용하지만 파이썬 2.6.6를 사용하고 등을 둥글게 시도하고 어쨌든 잔인한 날 것으로 보인다.

스파크 1.6.3.

어떻게 해결할 수 있습니까?

추가 된 간단한 코드 :

lines = sc.textFile("/user/ahouskova/movies/my.data") columns_data = lines.map(lambda line: line.split("\t")) ratings = columns_data.map(lambda c: (c[1], (c[2], 1.0))) movie_ratings_total_counts = ratings.reduceByKey(lambda m1, m2: (m1[0] + m2[0], m1[1] + m2[1])) avg_ratings = movie_ratings_total_counts.mapValues(lambda total: round(float(total[0])/total[1])) sorted_by_avg_rtg = avg_ratings.sortBy(lambda x: x[1])

둥글게

[(u'1269', '433355525.0'), (u'1524', '5693044.0')]

새로운 기반으로 문자열

[(u'1269', '433355525.400'), (u'1524', '5693044.250')]


답변

0

포맷 실행중인 코드에 대해 제공 한 데이터

제공하는 오류 당신은 다음과 같습니다 에 ValueError : 유니 코드 플로트() 문자 너무 오래

문제를 변환하는 것 같다 "\의 t에 의해

  • 읽기 문자열
  • 분할을 "(참고 : 여전히 문자열 임)
  • reduceByKey 두 번째 요소는 부동 소수점 인 것으로 가정하고 실제로는 ~.

이 줄을을 떠 두 번째 요소를 캐스팅 할 수 있습니다

대신 :

ratings = columns_data.map(lambda c: (c[1], (c[2], 1.0))) 

당신은 할 수 있습니다 :

ratings = columns_data.map(lambda c: (c[1], (float(c[2]), 1.0))) 
+0

안녕하세요. Ive는 플로팅을 계산하는 중에도 변환하려고했습니다. 전환지도 함수는 위에서 언급 한 것과 같은 오류를 보여줍니다. –

+0

@la_femme_it -'map' 함수의 실패의 의미는,'map'하는 RDD가 하나 이상의 (하나 이상의) 튜플의 두 번째 요소에 잘못된 데이터를 가지고 있다는 것입니다. – Yaron

+0

@la_femme_it 질문에 충분한 데이터가 없으므로 문제의 원인을 이해할 수 있습니다 (입력 데이터, 튜플의 두 번째 요소 계산, 즉 평균 또는 기타) – Yaron