Dataframe Pyspark架构更新/更改数据帧

Dataframe Pyspark架构更新/更改数据帧,dataframe,pyspark,Dataframe,Pyspark,我需要从S3读取一个csv文件,它有字符串,双数据,但我将读取为字符串,这将提供一个只有字符串的动态帧。我想为每一行做下面的事情 连接少数列并创建新列 添加新列 将第3列中的值从字符串转换为日期 将第4、5、6列的值分别从字符串转换为十进制 下面是到目前为止我编写的代码 def ConvertToDec(myString): pattern = re.compile("[0-9]{0,4}[\\.]?[0-9]{0,4}[-]?") myString=myString.strip

我需要从S3读取一个csv文件,它有字符串,双数据,但我将读取为字符串,这将提供一个只有字符串的动态帧。我想为每一行做下面的事情

  • 连接少数列并创建新列
  • 添加新列
  • 将第3列中的值从字符串转换为日期
  • 将第4、5、6列的值分别从字符串转换为十进制
  • 下面是到目前为止我编写的代码

    def ConvertToDec(myString):
        pattern = re.compile("[0-9]{0,4}[\\.]?[0-9]{0,4}[-]?")
        myString=myString.strip()
        doubleVal="";
        if  myString and  not pattern.match(myString):
           doubleVal=-9999.9999;
        else:
         doubleVal=-Decimal(myString);
        return doubleVal
    
    def rowwise_function(row): 
        row_dict = row.asDict()
        data='d';
        if not row_dict['code']:
            data=row_dict['code']
        else:  
            data='CD'
        if not row_dict['performancedata']:
            data= data +row_dict['performancedata']
        else:  
            data=data + 'HJ'
        // new columns
        row_dict['LC_CODE']=data
        row_dict['CD_CD']=123
        row_dict['GBL']=123.345
        if rec["created_date"]:
            rec["created_date"]= convStr =datetime.datetime.strptime(rec["created_date"], '%Y-%m-%d')
        if rec["performancedata"]
            rec["performancedata"] = ConvertToDec(rec["performancedata"])
    
        newrow = Row(**row_dict)
        return newrow
    
    store_df = spark.read.option("header","true").csv("C:\\STOREDATA.TXT", sep="|")
    ratings_rdd = store_df.rdd
    ratings_rdd_new = ratings_rdd.map(lambda row: rowwise_function(row))
    updatedDF=spark.createDataFrame(ratings_rdd_new)
    
    基本上,我正在创建几乎新的数据帧。我的问题如下-

  • 这是正确的方法吗
  • 既然我在改变我的模式,还有其他的方法吗

  • 使用Spark dataframes/sql,为什么要使用rdd?您不需要执行任何低级数据操作,所有操作都是列级的,因此数据帧使用起来更方便/高效

    要创建新列,请使用列(,)() 可以制作所有if
    。过滤器
    ()


    整个
    ConvertToDec
    可以使用strip和ast模块编写得更好,或者
    float

    似乎是一个奇怪的悬赏问题。如何更改现有列?像ConverttoDec我该怎么做?如果我不应该使用行函数,您可以使用:
    df['col\u name']
    选择一列,并进行必要的更改。我建议使用withColumns,这样您就可以同时拥有旧列和新列,最后只需添加一个select来选择所需的列。如果您对sql更熟悉,那么您可以创建一个视图并使用它。。谢谢你的回答。如果这很有帮助,你是说我可以用“withColumn”修改现有的和新的专栏?你能举一个例子,用进动法对withColumnRow迭代进行十进制解析吗?这种方法效率很低。这是执行dataframe列操作的长形式。使用
    with column
    通过执行操作添加新列,然后使用
    在最后选择所需列。选择
    。。。示例代码:,请检查该功能,并根据需要更换该功能。。
    def ConvertToDec(myString):
        pattern = re.compile("[0-9]{0,4}[\\.]?[0-9]{0,4}[-]?")
        myString=myString.strip()
        doubleVal="";
        if  myString and  not pattern.match(myString):
           doubleVal=-9999.9999;
        else:
         doubleVal=-Decimal(myString);
        return doubleVal
    
    def rowwise_function(row): 
        row_dict = row.asDict()
        data='d';
        if not row_dict['code']:
            data=row_dict['code']
        else:  
            data='CD'
        if not row_dict['performancedata']:
            data= data +row_dict['performancedata']
        else:  
            data=data + 'HJ'
        // new columns
        row_dict['LC_CODE']=data
        row_dict['CD_CD']=123
        row_dict['GBL']=123.345
        if rec["created_date"]:
            rec["created_date"]= convStr =datetime.datetime.strptime(rec["created_date"], '%Y-%m-%d')
        if rec["performancedata"]
            rec["performancedata"] = ConvertToDec(rec["performancedata"])
    
        newrow = Row(**row_dict)
        return newrow
    
    store_df = spark.read.option("header","true").csv("C:\\STOREDATA.TXT", sep="|")
    ratings_rdd = store_df.rdd
    ratings_rdd_new = ratings_rdd.map(lambda row: rowwise_function(row))
    updatedDF=spark.createDataFrame(ratings_rdd_new)