2016-08-16 27 views
0

私は文字列の長さが38文字で、実際は数値です。PySparkで非常に長い文字列を整数または長整数としてキャスト

id = '678868938393937838947477478778877 .....'(38文字)

どうすれば長い整数にキャストできますか?私はIntegerType、LongTypeとDoubleTypeでキャスト関数を試してみましたが、カラムを表示しようとするとNullsが返されます。

これは、この列を使用して内部ジョインを行う必要があるためです。なぜなら、StringがJava Heap Space Errorsを与えているからです。

Long Integerとしてキャストする方法についてのご意見はありますか? {この質問は文字列を長整数にキャストしようとします}

+0

python 2.7を使用して再現できません。int(id)を実行しても問題ありません。 –

+0

あなたは何を試してみましたか? –

+0

[データフレーム列をpysparkのString型からDouble型に変更する方法](http://stackoverflow.com/questions/32284620/how-to-change-a-dataframe-column-from-string-type) -to-double-type-in​​-pyspark) –

答えて

1

あなたは簡単に言えません。スパークDataFrameは、次のタイプのマッピングを使用するJVMのオブジェクトである:

  • IntegerTypeから1
から1
  • LongType - - MaxValue等しい2 ** 63と>LongMAX_VALUE等しい2 ** 31と>Integer

    DecimalTypeを最大許容限度(38)で試してみることができます。あなたがなく、精度の損失なしに、二重にキャストすることができ、より大きな数字で

    df = sc.parallelize([("9" * 38, "9" * 39)]).toDF(["x", "y"]) 
    df.select(col("x").cast("decimal(38, 0)")).show(1, False) 
    
    ## +--------------------------------------+ 
    ## |x          | 
    ## +--------------------------------------+ 
    ## |99999999999999999999999999999999999999| 
    ## +--------------------------------------- 
    

    :メモリエラーであなたを助けにはなりません数値型にキャスト言われ

    df.select(
        col("y").cast("decimal(38, 0)"), col("y").cast("double")).show(1, False) 
    
    ## +----+------+ 
    ## |y |y  | 
    ## +----+------+ 
    ## |null|1.0E39| 
    ## +----+------+ 
    

    こと。

  • +0

    この方法は私には役に立ちます。 @ zero323、数値型へのキャストがメモリエラーの助けにならないという最後の提案を見ていきます。 –

    関連する問題