कैसे एक टाइपफ़ॉर्म कॉलम को स्ट्रिंग टाइप से डबल टाइप में pyspark में बदलें


99

मेरे पास स्ट्रिंग के रूप में कॉलम के साथ एक डेटाफ्रेम है। मैं स्तंभ प्रकार को PySpark में डबल प्रकार में बदलना चाहता था।

निम्नलिखित तरीका है, मैंने किया:

toDoublefunc = UserDefinedFunction(lambda x: x,DoubleType())
changedTypedf = joindf.withColumn("label",toDoublefunc(joindf['show']))

बस जानना चाहता था, क्या यह सही तरीका है कि लॉजिस्टिक रिग्रेशन से गुजरते समय, मुझे कुछ त्रुटि हो रही है, इसलिए मुझे आश्चर्य है, क्या यही परेशानी का कारण है।

जवाबों:


169

यहां यूडीएफ की जरूरत नहीं है। Columnपहले से ही उदाहरण के साथ castविधि प्रदान करता है :DataType

from pyspark.sql.types import DoubleType

changedTypedf = joindf.withColumn("label", joindf["show"].cast(DoubleType()))

या छोटी स्ट्रिंग:

changedTypedf = joindf.withColumn("label", joindf["show"].cast("double"))

जहां विहित स्ट्रिंग नाम (अन्य विविधताएं भी समर्थित हो सकती हैं) simpleStringमूल्य के अनुरूप हैं । इसलिए परमाणु प्रकारों के लिए:

from pyspark.sql import types 

for t in ['BinaryType', 'BooleanType', 'ByteType', 'DateType', 
          'DecimalType', 'DoubleType', 'FloatType', 'IntegerType', 
           'LongType', 'ShortType', 'StringType', 'TimestampType']:
    print(f"{t}: {getattr(types, t)().simpleString()}")
BinaryType: binary
BooleanType: boolean
ByteType: tinyint
DateType: date
DecimalType: decimal(10,0)
DoubleType: double
FloatType: float
IntegerType: int
LongType: bigint
ShortType: smallint
StringType: string
TimestampType: timestamp

और उदाहरण के लिए जटिल प्रकार

types.ArrayType(types.IntegerType()).simpleString()   
'array<int>'
types.MapType(types.StringType(), types.IntegerType()).simpleString()
'map<string,int>'

2
colफ़ंक्शन का उपयोग करना भी काम करता है। from pyspark.sql.functions import col, changedTypedf = joindf.withColumn("label", col("show").cast(DoubleType()))
स्टाज़ा

कास्ट () "स्ट्रिंग" वाक्यविन्यास) के संभावित मान क्या हैं?
वाईरवान पुरवंतो

मैं विश्वास नहीं कर सकता कि कैसे स्पार्क डॉक्टर डेटेटाइप के लिए वैध स्ट्रिंग पर था। मेरे द्वारा पाया जा सकने वाला निकटतम संदर्भ यह था: docs.tibco.com/pub/sfire-analyst/7.7.1/doc/html/en-US/…
वियुरन पुरवांटो

1
एक बार में कई कॉलम कैसे बदलें?
हुइ चेन

मैं असत्य को असत्य में कैसे बदलूं?
पिचब्लैक 408

48

स्तंभ के नाम को संरक्षित करें और इनपुट कॉलम के समान नाम का उपयोग करके अतिरिक्त स्तंभ जोड़ से बचें:

changedTypedf = joindf.withColumn("show", joindf["show"].cast(DoubleType()))

3
धन्यवाद मैं देख रहा था कि मूल स्तंभ नाम को कैसे बनाए रखा जाए
javadba

वहाँ एक सूची है जहाँ कहीं छोटे तार डेटा प्रकार स्पार्क की पहचान करेगा?
अल्फ्रेडॉक्स

1
यह समाधान भी एक पाश में शानदार तरीके से काम करता है जैसेfrom pyspark.sql.types import IntegerType for ftr in ftr_list: df = df.withColumn(f, df[f].cast(IntegerType()))
क्वेटज़ालकोट

10

दिए गए उत्तर समस्या से निपटने के लिए पर्याप्त हैं लेकिन मैं एक और तरीका साझा करना चाहता हूं जिसे स्पार्क के नए संस्करण के साथ पेश किया जा सकता है (मुझे इस पर यकीन नहीं है) इसलिए दिए गए उत्तर ने इसे नहीं पकड़ा।

हम col("colum_name")कीवर्ड के साथ स्पार्क स्टेटमेंट में कॉलम तक पहुँच सकते हैं :

from pyspark.sql.functions import col , column
changedTypedf = joindf.withColumn("show", col("show").cast("double"))

5

pyspark संस्करण:

  df = <source data>
  df.printSchema()

  from pyspark.sql.types import *

  # Change column type
  df_new = df.withColumn("myColumn", df["myColumn"].cast(IntegerType()))
  df_new.printSchema()
  df_new.select("myColumn").show()

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.