Spark Python: sortBy causes ValueError: Unicode float() literal too long to convert

Spark Python: sortBy causes ValueError: Unicode float() literal too long to convert

我有一个如下所示的 RDD:

rdd.take(2)

(ID,平均评分)

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

我正在尝试按功能对其进行排序 sortBy()

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

它应该 return 排序的 ID 列表。我收到以下错误:

ValueError: Unicode float() literal too long to convert

    at org.apache.spark.api.python.PythonRunner$$anon.read(PythonRDD.scala:166)
    at org.apache.spark.api.python.PythonRunner$$anon.<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

我厌倦了将浮点值转换回 Unicode,并向后转换。我试着把它四舍五入等等

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

也许使用 Decimal 会是解决方案,但我使用的是 Python 2.6.6,在我看来它还是有点过头了。

Spark 1.6.3.

我该如何解决这个问题?

添加了简单代码:

<code>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')]


根据您提供的有关代码的新数据,您是 运行。

您提供的错误是:ValueError: Unicode float() literal too long to convert

问题似乎是:

  • 读取字符串
  • 用"\t"分割(注意:还是字符串)
  • 执行reduceByKey假设第二个元素是浮点数 而它实际上是一个字符串。

您可以在这一行中将第二个元素转换为 float

而不是:

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)))