Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用python或scala将非标准csv文件读入数据帧_Python_Scala_Dataframe_Rdd - Fatal编程技术网

如何使用python或scala将非标准csv文件读入数据帧

如何使用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

我在下面有一个数据集采样,要用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,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上,它们有不同的方法。