Dataframe Pyspark架构更新/更改数据帧
我需要从S3读取一个csv文件,它有字符串,双数据,但我将读取为字符串,这将提供一个只有字符串的动态帧。我想为每一行做下面的事情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
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)