如何使用python或scala将非标准csv文件读入数据帧
我在下面有一个数据集采样,要用python或scala进行处理:如何使用python或scala将非标准csv文件读入数据帧,python,scala,dataframe,rdd,Python,Scala,Dataframe,Rdd,我在下面有一个数据集采样,要用python或scala进行处理: FWD,13032009:09:01,10.56| FWD,13032009:10:53,11.23| FWD,13032009:15:40,23.20 SPOT,13032009:09:04,11.56| FWD,13032009:11:45,11.23| SPOT,13032009:12:30,23.20 FWD,13032009:08:01,10.56| SPOT,13032009:12:30,11.23| FWD,1303
FWD,13032009:09:01,10.56| FWD,13032009:10:53,11.23| FWD,13032009:15:40,23.20
SPOT,13032009:09:04,11.56| FWD,13032009:11:45,11.23| SPOT,13032009:12:30,23.20
FWD,13032009:08:01,10.56| SPOT,13032009:12:30,11.23| FWD,13032009:13:20,23.20| FWD,13032009:14:340,56.00
FWD,13032009:08:01,10.56| SPOT,13032009:12:30,11.23| FWD,13032009:13:20,23.20
每一行将被分割成多个更小的字符串,这些字符串可以进一步分割
我正在寻找一种高效的方法来生成RDD或数据帧,其内容如下:
FWD,13032009:09:01,10.56
FWD,13032009:10:53,11.23
FWD,13032009:15:40,23.20
SPOT,13032009:09:04,11.56
FWD,13032009:11:45,11.23
SPOT,13032009:12:30,23.20
FWD,13032009:08:01,10.56
SPOT,13032009:12:30,11.23
FWD,13032009:13:20,23.20
FWD,13032009:14:340,56.00
FWD,13032009:08:01,10.56
SPOT,13032009:12:30,11.23
FWD,13032009:13:20,23.20
请注意,效率越高越好,因为生产中的总行数可能高达100万行
非常感谢。Python解决方案:如果您以字符串形式获取文本,您可以用换行符(
\n
)替换(您的|
序列),然后将其作为数据帧读取:
将熊猫作为pd导入
从io导入StringIO
数据集=“前进,13032009:09:01,10.56 |前进,13032009:10:53,11.23 |前进,13032009:15:40,23.20
SPOT,13032009:09:04,11.56 |前进,13032009:11:45,11.23 | SPOT,13032009:12:30,23.20
前进,13032009:08:01,10.56 |地点,13032009:12:30,11.23 |前进,13032009:13:20,23.20 |前进,13032009:14:340,56.00
前进,13032009:08:01,10.56 |地点,13032009:12:30,11.23 |前进,13032009:13:20,23.20
"""
数据集*=100000#超过一百万个元素以确保性能足够
数据集=数据集。替换(“|”),“\n”)
data_set_stream=StringIO(data_set)#Pandas需要读取类似文件的对象,因此需要将字符串转换为缓冲区
df=pd.read\u csv(数据集\u流)
打印(df)#df是我们想要的数据帧
假设您正在读取csv文件,则可以将每一行读取到列表中。展平这些值,然后将它们作为单独的行进行处理
将文件读取到列表中-100万行不应太难处理:
import csv
import itertools
import pandas as pd
with open('test.csv','r') as f:
reader = csv.reader(f, delimiter = '|')
rows = list(reader)
从单个列表中展开和拆分-Python标准库中的优秀itertools
库返回一个生成器,该生成器有助于节省内存,而且效率很高
flat_rows = itertools.chain.from_iterable(rows)
list_rows = [i.strip().split(',') for i in flat_rows]
嵌套列表,list\u rows
现在为您提供了一个干净且格式化的列表,如果您想创建dataframe
,可以将其发送到pandas
list_rows
>>
[['FWD', '13032009:09:01', '10.56'],
['FWD', '13032009:10:53', '11.23'],
['FWD', '13032009:15:40', '23.20'],
['SPOT', '13032009:09:04', '11.56'],
['FWD', '13032009:11:45', '11.23'],
['SPOT', '13032009:12:30', '23.20'],
['FWD', '13032009:08:01', '10.56'],
['SPOT', '13032009:12:30', '11.23'],
['FWD', '13032009:13:20', '23.20'],
['FWD', '13032009:14:340', '56.00'],
['FWD', '13032009:08:01', '10.56'],
['SPOT', '13032009:12:30', '11.23'],
['FWD', '13032009:13:20', '23.20']]
df = pd.DataFrame(list_rows)
如果您感兴趣,这里是Scala方法
val rdd1=sc.parallelize(列表(“FWD,13032009:09:01,10.56 | FWD,13032009:10:53,11.23 | FWD,13032009:15:40,23.20”,“SPOT,13032009:09:04,11.56 | FWD,13032009:11,11.23 | SPOT,13032009:12:30,10.56 | SPOT,13032009:01,12:30,11.23 | FWD,13032009:20,20”),“FWD,13032009:08:01,10.56 | SPOT,13032009:12:30,11.23 | FWD,13032009:13:20,23.20”))
val rdd2=rdd1.flatMap(l=>l.replaceAll(“,”).split(“\\\\”)
val rds=rdd2.toDS
val df=spark.read.csv(rds)
df.show(假)
+----+---------------+-----+
|_c0 | U c1 | U c2|
+----+---------------+-----+
|FWD | 13032009:09:01 | 10.56|
|前进| 13032009:10:53 | 11.23|
|FWD | 13032009:15:40 | 23.20|
|现场| 13032009:09:04 | 11.56|
|前进| 13032009:11:45 | 11.23|
|现场| 13032009:12:30 | 23.20|
|FWD | 13032009:08:01 | 10.56|
|现场| 13032009:12:30 | 11.23|
|前进| 13032009:13:20 | 23.20|
|FWD | 13032009:14:340 | 56.00|
|FWD | 13032009:08:01 | 10.56|
|现场| 13032009:12:30 | 11.23|
|前进| 13032009:13:20 | 23.20|
+----+---------------+-----+
谢谢Oliver,在生产中,我们无法以您的方式生成数据集,它必须从文件中读取,这里的问题是文件不是标准的csv,因为某些行包含不同于其他行的较小csv部分,在示例数据中,您可以看到第三行有4个部分,而其他行有4个部分让3代替硬编码字符串(如我的示例中所示),您只需将文件读入data\u set
变量:,打开(“DATASET\u FILENAME”,“r”)作为my\u file:data\u set=my\u file.read()
。其次,我的示例通过分离任何数量的要连接的节,巧妙地处理了不同数量的节(您可以尝试我的代码,看看它是否正确地展平了数据集)。谢谢Oliver,我如何将pandas创建的数据框注册为诱惑?我想在TeampTable上运行查询如果你想运行查询,pandas
有一个api。非常感谢Bernard,我如何将pandas df注册为普通df这样的诱惑,以便我可以使用sql进行分析?@mdivk好的,我建议如果你想分析它,因为它已经在一个数据框中,用熊猫进行分析。pandas
。如果你想存储它,请查找pd.dataframe.to_sql。如果你有一个新问题,发布一个新问题,然后从那里开始,谢谢!谢谢你Bernard,我只需要将df注册到一个临时表中,然后运行特别的sql query,你能在这里分享吗……请……我尝试了df.registerTempTable(“test”)
,但它在我的python3 Jupyter记事本中不起作用。你需要弄清楚你是在spark
rdd还是pandas
dataframe上,它们有不同的方法。