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)))
我有一个如下所示的 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)))