Сообщение об ошибке связано с типом «a» в вашем закрытии.
My_KMV = My_KV.reduce(lambda a, b: a.append([b]))
Пусть pySpark явно оценивает a как список. Например,
My_KMV = My_KV.reduceByKey(lambda a,b:[a].extend([b]))
Во многих случаях reduceByKey будет предпочтительнее groupByKey, обратитесь к: http://databricks.gitbooks.io/databricks-spark-knowledge-base/content/ best_practices / prefer_reducebykey_over_groupbykey.html
Сохранение конечных нулей, подобных этому, было введено в .NET 1.1 для более строгого соответствия спецификации ECI CLI.
В MSDN имеется некоторая информация об этом. здесь .
Вы можете отрегулировать точность следующим образом:
Я обнаружил, что могу «подделать» шкалу умножением или делением на фантазию 1.
decimal a = 2m;
decimal c = 2.00000000m;
decimal PreciseOne = 1.000000000000000000000000000000m;
//add maximum trailing zeros to a
decimal x = a * PreciseOne;
//remove all trailing zeros from c
decimal y = c / PreciseOne;
Я могу изготовить достаточно точный 1 для изменения масштабных коэффициентов по известным размерам.
decimal scaleFactorBase = 1.0m;
decimal scaleFactor = 1m;
int scaleFactorSize = 3;
for (int i = 0; i < scaleFactorSize; i++)
{
scaleFactor *= scaleFactorBase;
}
decimal z = a * scaleFactor;
Заманчиво путать decimal
в SQL Server с decimal
в .NET; они совершенно разные.
SQL Server decimal
- это номер фиксированной точки, точность и масштаб которого фиксированы при определении столбца или переменной.
A .NET decimal
- это число с плавающей запятой, например float
и double
(разница в том, что decimal
точно сохраняет десятичные цифры, тогда как float
и double
точно сохраняют двоичные цифры). Попытка контролировать точность .NET decimal
бессмысленна, поскольку все вычисления дают одинаковые результаты независимо от наличия или отсутствия нулей заполнения.
SQL decimal
, который быстро терпит неудачу, когда ему передается c# decimal
... в моем случае я использовал Precision: 2, Scale: (none), и я не могу назначить 800
к нему из-за того, что значение вне диапазона
– ekkis
27 September 2011 в 01:00
Вы просто видите разные представления одних и тех же данных.
Из System.Decimal
:
Точностьdecimal
будет масштабироваться так, чтобы она была (по причине)Десятичное число - это значение с плавающей запятой, которое состоит из знака, числового значения, где каждая цифра в значении находится в диапазоне от 0 до 9, и коэффициент масштабирования, который указывает положение плавающей десятичной точки, которая разделяет интегральную и дробную части числового значения.
Двоичное представление десятичного значения состоит из 1-битового знака, 96-битного целочисленного числа и коэффициента масштабирования, используемого для разделите 96-битное целое число и укажите, какая часть его является десятичной дробью. Коэффициент масштабирования неявно равен числу 10, поднятому до экспоненты в диапазоне от 0 до 28. Следовательно, двоичное представление десятичного значения имеет вид ((от -296 до 296) / 10 (от 0 до 28)), где -296-1 равно MinValue, а 296-1 равно MaxValue.
Масштабный коэффициент также сохраняет любые конечные нули в десятичном числе. Конечные нули не влияют на значение десятичного числа в арифметических или сравнительных операциях. Однако конечные нули могут быть обнаружены методом ToString, если применяется соответствующая строка формата.
blockquote>
Вопрос в том, действительно ли вам нужна точность, хранящаяся в десятичной системе, а не просто отображение десятичной точки в требуемую точность. Большинство приложений знают внутренне, насколько точны они хотят быть и демонстрировать этот уровень точности. Например, даже если пользователь вводит счет-фактуру за 100 в пакете учетных записей, он все равно печатает как 100.00, используя что-то вроде val.ToString («n2»).
Как я могу создать b из? Как я могу создать b из c?
blockquote>c в b.
Console.WriteLine(Math.Round(2.00000000m, 1))
производит 2.0
a to b является сложным, поскольку концепция введения точности немного чуждо математике.
Я предполагаю, что ужасный взлом может быть в оба конца.
decimal b = Decimal.Parse(a.ToString("#.0")); Console.WriteLine(b);
производит 2.0
Это приведет к удалению всех конечных нулей из десятичной дроби, а затем вы можете просто использовать ToString()
.
public static class DecimalExtensions
{
public static Decimal Normalize(this Decimal value)
{
return value / 1.000000000000000000000000000000000m;
}
}
Или, если вы хотите, чтобы точное количество завершающих нулей, скажем, 5, сначала Normalize (), а затем умножьте на 1.00000 м.
1
. См. Комментарии к другому ответу .
– Jeppe Stig Nielsen
26 August 2013 в 14:43
Что относительно Math.Round (десятичный d, int decimals) ?
1.000...
, чтобы уменьшить точность. – Jeppe Stig Nielsen 26 August 2013 в 14:41