大风歌,黄粱一梦,尼日利亚-全齐牛仔低价销售信息网

admin 2019-06-12 阅读:167

选自towardsdatascience

作者:Marc Laforet

参加:高璇、路

Python 能够完结某项使命,并不意味着这个使命就应该运用 Python 来做。

作为一名 Web 开发人员,我第一次与数据库和 SQL 发生交集是运用目标联络映射(ORM)。我运用的是 Django 查询集 API,这个界面用户体会很好。之后,我转向数据工程方向,更多地运用数据集来构建 AI。我的责任是从用户应用程序中获取数据,并将其转化为数据科学家可运用的内容,这一进程一般称为 ETL (extract, transform and load)。

跟着工业开展,出产体系中的数据十分紊乱,需求进行很多转化才干用于构建 AI。有些 JSON 列每行形式都不相同,有些列包括混合数据类型,有些行有过错值。此外,还需求核算「用户成为拜访者的时刻」以及「他们在两次拜访间的等待时刻」等特征。当我着手整理、聚合和办理数据特征时,我想确认哪种言语最适合该使命。在之前的作业中我每天都运用 Python,我知道它能够完结作业。可是,这次阅历使我了解到,Python 能够完结一项使命并不意味着这个使命就应该运用 Python 来做。

我对 SQL 的第一个误解是:SQL 无法进行杂乱的转化

咱们正在处理一个时刻序列数据集,咱们期望能够盯梢特定用户。隐私法规不允许获取用户拜访的详细日期,因而咱们决定将记载日期归一化为用户初次拜访的日期(如初次拜访后 5 天等)。关于咱们的剖析,重要的是要知道离前次拜访过去了多久以及离初次拜访过去了多久。A 有两个样本数据集,一个有大约 750 万行,巨细为 6.5 GB,另一个有 55 万行,巨细为 900MB。

我运用下面的 Python 和 SQL 代码先在较小的数据集上测验转化。Python 和 SQL 别离花费 591 秒和 40.9 秒完结了使命。这意味着 SQL 的速度是 Python 的大约 14.5 倍!

-- SQL equivalent-- increase the working memory (be careful with this)setwork_mem='600MB';-- create a dual index on the partitionCREATEINDEXIFNOTEXISTSuser_time_index ONtable(user_id, timestamp);-- calculate time since last visit and time since first visit in one pass SELECT*, AGE(timestamp, LAG(timestamp, 1, timestamp) OVERw) AStime_since_last, AGE(timestamp, FIRST_VALUE(timestamp) OVERw) AStime_since_first FROMtableWINDOWw AS(PARTITIONBYuser_id ORDERBYtimestamp);

SQL 转化不只速度更快,而且代码也更易读,更易于保护。在这里,我运用 lag 和 first_value 函数来查找用户历史记载中的特定记载(即分区)。然后运用 age 函数来确认两次拜访间的时刻差。

更风趣的是,当这些转化脚本应用于 6.5 GB 的数据集时,Python 彻底失利。在 3 次测验中,Python 溃散了 2 次,第三次我的核算机彻底溃散...... 而 SQL 只耗时 226 秒。

更多信息拜见:

我对 SQL 的第一个误解是:SQL 无法扁平化不规则的 json

对我来说,另一个改动是我意识到 Postgres 能够很好地处理 json。我开始以为用 Postgres 扁平化或解析 json 是不或许的...... 我不敢信任自己居然如此愚笨。假如你想相关 json 而且它的形式在行间是共同的,那么最好的挑选或许便是运用 Postgres 内置功用来解析 json。

另一方面,我的样本数据会集一半 json 不是有用的,因而存储为文本。在这种情况下,我要么从头编码数据使其有用,或许删去无效的行。为此,我创建了一个名为 is_json 的新 SQL 函数,然后运用该函数来验证 WHERE 子句中的 json 是否有用。

不幸的是,我发现 user_json 具有不同的形式,详细取决于用户所运用的 app 版别。尽管从应用程序开发的视点来看这是有道理的,可是有条件地解析每行的每种或许性价值是很昂扬的。莫非我的终究归宿仍是 Python?不不不!我在 Stack Overflow 上找到了一个由 Postgres 大神编写的 klin 函数(https://stackoverflow.com/users/1995738/klin)。

这个函数能够成功地扁平化 json,轻松处理我的噩梦。

结语

有一种说法叫「Python 是做任何事情的第二好言语」。我信任这是真的,而且在某些情况下 Python 和「最好」言语之间的功用差异能够忽略不计。可是在本文介绍的情况下,Python 无法与 SQL 比肩。这些发现彻底改动了我做 ETL 的办法。我现在的作业形式是「不要将数据移动到代码中,而是将代码移动到数据中」。Python 将数据移动到代码中,而 SQL 履行后者。更重要的是,我知道我仅仅触及了 SQL 和 postgres 的皮裘。我等待能发掘出更多超卓的功用,运用剖析库完成加快。

原文链接:https://towardsdatascience.com/python-vs-sql-comparison-for-data-pipelines-8ca727b34032

本文为机器之心编译,转载请联络本大众号取得授权。

声明:该文观念仅代表作者自己,搜狐号系信息发布渠道,搜狐仅供给信息存储空间服务。