文字列形式の科学的記数法をsparkデータフレームの数値に変換します

ニハル
Day_Date,timeofday_desc,Timeofday_hour,Timeofday_minute,Timeofday_second,value
2017-12-18,12:21:02 AM,0,21,2,“1.779209040E+08”
2017-12-19,12:21:02 AM,0,21,2,“1.779209040E+08”
2017-12-20,12:30:52 AM,0,30,52,“1.779209040E+08”
2017-12-21,12:30:52 AM,0,30,52,“1.779209040E+08”
2017-12-22,12:47:10 AM,0,47,10,“1.779209040E+08”
2017-12-23,12:47:10 AM,0,47,10,“1.779209040E+08”
2017-12-24,02:46:59 AM,2,46,59,“1.779209040E+08”
2017-12-25,02:46:59 AM,2,46,59,“1.779209040E+08”
2017-12-26,03:10:27 AM,3,10,27,“1.779209040E+08”
2017-12-27,03:10:27 AM,3,10,27,“1.779209040E+08”
2017-12-28,03:52:08 AM,3,52,8,“1.779209040E+08”

value列をに変換しようとしています177920904

val df1 = df.withColumn("s", 'value.cast("Decimal(10,4)")).drop("value").withColumnRenamed("s", "value")

またとして値をキャストしてみましたFloatDouble出力として常にnullを取得します

df1.select("value").show()


+-----------+
|   value   |
+-----------+
|       null|
|       null|
|       null|
|       null|
|       null|
|       null|
|       null|
|       null|

df.printSchema

root
 |-- Day_Date: string (nullable = true)
 |-- timeofday_desc: string (nullable = true)
 |-- Timeofday_hour: string (nullable = true)
 |-- Timeofday_minute: string (nullable = true)
 |-- Timeofday_second: string (nullable = true)
 |-- value: string (nullable = true)
SCouto

数に合うのに十分なスペースがある10進数にキャストする必要があります。

DecimalはDecimal(precision、scale)であるため、Decimal(10、4)は合計10桁、ドットの左側に6桁、右側に4桁を意味するため、数値はDecimalタイプに適合しません。

ドキュメントから

精度は、表現できる合計桁数を表します

scaleは、小数桁数を表します。この値は、精度以下である必要があります。スケール0は、小数部分のない整数値を生成します

右側に数字が必要ないので、これを試すことができます

df.withColumn("s", 'value.cast("Decimal(10,0)"))

10進数の4桁を保持したい場合は、次のように変更できます。

df.withColumn("s", 'value.cast("Decimal(14,4)"))

入力

df.show
+---------------+
|          value|
+---------------+
|1.779209040E+08|
+---------------+

出力

scala> df.withColumn("s", 'value.cast("Decimal(10,0)")).show
+---------------+---------+
|          value|        s|
+---------------+---------+
|1.779209040E+08|177920904|
+---------------+---------+

完全なソリューション

ドロップもレナミグもなし

val df1 = df.withColumn("value", 'value.cast("Decimal(10,0)"))

入力データを修正する

コメントで言ったように、問題はあなたの数字がそれらの周りにいくつかの奇妙な文字を含んでいるということです、あなたはキャストする前にそれを取り除くべきです

元の

scala> df.show
+----------+--------------+--------------+----------------+----------------+-----------------+
|  Day_Date|timeofday_desc|Timeofday_hour|Timeofday_minute|Timeofday_second|            value|
+----------+--------------+--------------+----------------+----------------+-----------------+
|2017-12-18|   12:21:02 AM|             0|              21|               2| ?1.779209040E+08|
|2017-12-19|   12:21:02 AM|             0|              21|               2|?1.779209040E+08?|
|2017-12-20|   12:30:52 AM|             0|              30|              52| ?1.779209040E+08|
|2017-12-21|   12:30:52 AM|             0|              30|              52| ?1.779209040E+08|
|2017-12-22|   12:47:10 AM|             0|              47|              10| ?1.779209040E+08|
|2017-12-23|   12:47:10 AM|             0|              47|              10| ?1.779209040E+08|
|2017-12-24|   02:46:59 AM|             2|              46|              59| ?1.779209040E+08|
|2017-12-25|   02:46:59 AM|             2|              46|              59| ?1.779209040E+08|
|2017-12-26|   03:10:27 AM|             3|              10|              27| ?1.779209040E+08|
|2017-12-27|   03:10:27 AM|             3|              10|              27| ?1.779209040E+08|
|2017-12-28|   03:52:08 AM|             3|              52|               8| ?1.779209040E+08|
+----------+--------------+--------------+----------------+----------------+-----------------+

それらを削除する方法はたくさんありますが、簡単な方法は、UDFと正規表現を使用して、数字、文字、ドット、+、-以外のすべてを削除することです。

 def clean(input: String) = input.replaceAll("[^a-zA-Z0-9\\+\\.-]", "")
 val cleanUDF = udf(clean _ )
df.withColumn("value", cleanUDF($"value").cast(DecimalType(10,0))).show
+----------+--------------+--------------+----------------+----------------+---------+
|  Day_Date|timeofday_desc|Timeofday_hour|Timeofday_minute|Timeofday_second|    value|
+----------+--------------+--------------+----------------+----------------+---------+
|2017-12-18|   12:21:02 AM|             0|              21|               2|177920904|
|2017-12-19|   12:21:02 AM|             0|              21|               2|177920904|
|2017-12-20|   12:30:52 AM|             0|              30|              52|177920904|
|2017-12-21|   12:30:52 AM|             0|              30|              52|177920904|
|2017-12-22|   12:47:10 AM|             0|              47|              10|177920904|
|2017-12-23|   12:47:10 AM|             0|              47|              10|177920904|
|2017-12-24|   02:46:59 AM|             2|              46|              59|177920904|
|2017-12-25|   02:46:59 AM|             2|              46|              59|177920904|
|2017-12-26|   03:10:27 AM|             3|              10|              27|177920904|
|2017-12-27|   03:10:27 AM|             3|              10|              27|177920904|
|2017-12-28|   03:52:08 AM|             3|              52|               8|177920904|
+----------+--------------+--------------+----------------+----------------+---------+

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

科学的記数法の文字列をXPathの数値形式に変換します

分類Dev

Rでデータフレームの複数の列を文字列から数値に変換します

分類Dev

csv科学的記数法をUNIXの数値に変換します

分類Dev

プログラムでExcel列の形式を変更し、数値フィールドで指数(E)のような科学的記数法を防止します

分類Dev

数値を科学的記数法に変換し、指数フラッターを取得します

分類Dev

数値に変換する科学的記数法の文字列のtxtファイルを読む

分類Dev

科学的記数法の文字列を整数に変換する

分類Dev

科学的記数法をフルナンバーのlaravelで文字列に変換する方法

分類Dev

数値変数と文字列変数を含むリストをRのデータフレームに変換します

分類Dev

数値変数と文字列変数を含むリストをRのデータフレームに変換します

分類Dev

文字列フォーマットを適用して、データフレームの文字列(オブジェクト)列を数値に変換します

分類Dev

パンダの列を科学的記数法なしで文字列に変換する

分類Dev

データフレームの複数の列の文字列をfloatに変換します

分類Dev

データフレームのすべての数値列を絶対値に変換します

分類Dev

R-データフレーム内のすべての列のデータ型を文字から数値に動的に変換します

分類Dev

データフレーム内のJson文字列を複数の列に変換します

分類Dev

pandasデータフレームで列の値を16進数から2進数に変換します

分類Dev

複数のデータフレーム列を数値ベクトルに変換します

分類Dev

データフレームのすべての列を数値のsparkscalaに変換します

分類Dev

Sparkデータフレームは複数の行を列に変換します

分類Dev

データフレームの列の文字列から数値を抽出し、その文字列をその数値に置き換えます

分類Dev

科学的記数法の数値を10進数に変換する

分類Dev

複数の文字列のリストをPythonデータフレームに変換します

分類Dev

R複数の文字列長のリストをデータフレームに変換します

分類Dev

BigQuery-科学的記数法を10進形式に変換します

分類Dev

科学的記数法のフロートを「d.ddx10 ^(-n)」に変換します

分類Dev

Sparkデータフレームは列値を文字列変数に取得します

分類Dev

データフレームはfloatをすべて10進数の文字列に変換します

分類Dev

すべてのデータフレーム文字列を係数に変換します

Related 関連記事

  1. 1

    科学的記数法の文字列をXPathの数値形式に変換します

  2. 2

    Rでデータフレームの複数の列を文字列から数値に変換します

  3. 3

    csv科学的記数法をUNIXの数値に変換します

  4. 4

    プログラムでExcel列の形式を変更し、数値フィールドで指数(E)のような科学的記数法を防止します

  5. 5

    数値を科学的記数法に変換し、指数フラッターを取得します

  6. 6

    数値に変換する科学的記数法の文字列のtxtファイルを読む

  7. 7

    科学的記数法の文字列を整数に変換する

  8. 8

    科学的記数法をフルナンバーのlaravelで文字列に変換する方法

  9. 9

    数値変数と文字列変数を含むリストをRのデータフレームに変換します

  10. 10

    数値変数と文字列変数を含むリストをRのデータフレームに変換します

  11. 11

    文字列フォーマットを適用して、データフレームの文字列(オブジェクト)列を数値に変換します

  12. 12

    パンダの列を科学的記数法なしで文字列に変換する

  13. 13

    データフレームの複数の列の文字列をfloatに変換します

  14. 14

    データフレームのすべての数値列を絶対値に変換します

  15. 15

    R-データフレーム内のすべての列のデータ型を文字から数値に動的に変換します

  16. 16

    データフレーム内のJson文字列を複数の列に変換します

  17. 17

    pandasデータフレームで列の値を16進数から2進数に変換します

  18. 18

    複数のデータフレーム列を数値ベクトルに変換します

  19. 19

    データフレームのすべての列を数値のsparkscalaに変換します

  20. 20

    Sparkデータフレームは複数の行を列に変換します

  21. 21

    データフレームの列の文字列から数値を抽出し、その文字列をその数値に置き換えます

  22. 22

    科学的記数法の数値を10進数に変換する

  23. 23

    複数の文字列のリストをPythonデータフレームに変換します

  24. 24

    R複数の文字列長のリストをデータフレームに変換します

  25. 25

    BigQuery-科学的記数法を10進形式に変換します

  26. 26

    科学的記数法のフロートを「d.ddx10 ^(-n)」に変換します

  27. 27

    Sparkデータフレームは列値を文字列変数に取得します

  28. 28

    データフレームはfloatをすべて10進数の文字列に変換します

  29. 29

    すべてのデータフレーム文字列を係数に変換します

ホットタグ

アーカイブ